home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZMSC2.HAS < prev    next >
Text File  |  1997-08-27  |  321KB  |  14,678 lines

  1. *拍子処理を行う(保留)
  2. *相対系でステップタイムを付けるバリエーションを設ける(保留)
  3. *-------------------------------------------------------
  4. *
  5. *        割り込み処理部分ソースリスト
  6. *
  7. *         Programmed by Z.Nishikawa
  8. *
  9. *-------------------------------------------------------
  10.         .include    data_io.has
  11.         .text
  12.                     *効果音エントリ
  13. do_se_ope:                *効果音ルーチンの実質的なエントリ
  14. @@:
  15.     tst.l    jump_flg1-work(a6)    *ジャンプ系コマンドはルーチンを共有できない
  16.     bne    @b
  17. @@:
  18.     tst.l    jump_flg2-work(a6)
  19.     bne    @b
  20. @@:
  21.     tst.l    jump_flg3-work(a6)
  22.     bne    @b
  23.                     *アゴーギク処理
  24. agogik_base_se:    equ    (agogik_work_se-work)-(pmod_param-track_work)
  25.     tst.b    p_pmod_sw+agogik_base_se(a6)
  26.     beq    1f
  27.     lea    agogik_base_se(a6),a5
  28.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  29.     bne    pmdop_2nd_se
  30.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)    3/15
  31. *!3/15    move.b    #1,p_pmod_chain(a5)        *接続待機
  32. *!    tst.w    p_pmod_dpt_now(a5)
  33. *!    bne    @f
  34. *!    addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  35. *!@@:
  36.     moveq.l    #0,d5
  37.     moveq.l    #0,d6
  38.     bsr    fm_pmod
  39.     bra    @f
  40. pmdop_2nd_se:                    *2回目以降
  41.     bsr    pmod_ope
  42. @@:
  43.     bsr    do_agogik_se
  44. 1:
  45.     move.l    play_trk_tbl_se(pc),a5
  46.     bra    @f
  47. m_int_lp_se:
  48.     move.l    4(a6),a5
  49. @@:
  50.     moveq.l    #0,d0
  51.     move.w    (a5)+,d0
  52.     bmi    exit_int_se        *$ffなら未使用
  53. mil_patch_se:
  54.     nop                *jump系コマンド実行時にパッチ(bsr check_jump?_tr_id_se)
  55.     move.l    a5,4(a6)
  56.     swap    d0
  57.     lsr.l    #16-trwk_size_,d0
  58.     movea.l    seq_wk_tbl_se(pc),a5
  59.     adda.l    d0,a5            *a5=trk n seq_wk_tbl
  60.     clr.b    p_trk_seq_flg(a5)
  61.     move.l    p_type(a5),d4        *get ch(This is the global value.)
  62.     move.b    p_track_stat(a5),d0
  63.     andi.b    #(.not.ID_SE),d0
  64.     bne    m_int_lp_se        *case:-1 死んでいるならばなにもしない
  65.     subq.b    #1,p_trkfrq_wk(a5)    *割り込み比率処理
  66.     bcc    m_int_lp_se
  67.     move.b    p_trkfrq(a5),p_trkfrq_wk(a5)
  68.     move.l    p_int_play_ope(a5),a1
  69.     jsr    (a1)
  70.     bra    m_int_lp_se
  71.  
  72. exit_int_se:                *演奏割り込みルーチンの出口
  73. int_dummy:
  74.     rts
  75.  
  76. check_jump2_tr_id_se:            *[@]フェーズ2実行ルーチン
  77.     move.l    jump_flg_ptr(pc),a1
  78.     cmp.w    2(a1),d7        *jump_flgの示すトラックIDと今回の実行トラックが等しいか
  79.     beq    end_jump2_mode_se    *等しいならば走査が一周したことを意味する
  80.     rts
  81.  
  82. check_jump3_tr_id_se:            *[jump nn]フェーズ2実行ルーチン
  83.     move.l    jump_flg_ptr(pc),a1
  84.     cmp.w    2(a1),d7        *jump_flgの示すトラックIDと今回の実行トラックが等しいか
  85.     beq    end_jump3_mode_se    *等しいならば走査が一周したことを意味する
  86.     rts
  87.  
  88. int_entry_f:            *FM音源タイマ割り込みのエントリー
  89.     * 汎用レジスタ群    d0 d1 d2 d3 d5 d6 d7
  90.     *            a1 a2 a3(run_cmd_**以降ではグローバル)
  91.     *            a4(MIDIデータ送信で必ず破壊される)
  92.     * グローバルレジスタ群             d4     a0 (a3) a5 a6
  93.     movem.l    d0-d7/a0-a6,-(sp)
  94.     di_tmf
  95.     ori.w    #$0700,sr
  96.     move.w    $003c(sp),d7
  97.     ori.w    #$2000,d7
  98. int_entry_again:
  99.     lea    work(pc),a6
  100. 1:
  101.     move.b    fm_data_port,d0
  102.     bmi    1b
  103.     andi.w    #3,d0
  104.     ext.w    d0
  105.     lsl.w    #3,d0
  106.     move.l    fmint_tbl+4(pc,d0.w),a0
  107.     jmp    (a0)
  108.  
  109. int_entry_both:                *効果音割り込みと音楽割り込みが併発
  110.     move.b    #$14,fm_addr_port
  111.     move.w    fmint_tbl(pc,d0.w),d0
  112.     and.b    timer_mask(pc),d0
  113.     move.b    d0,$14+opmreg(a6)    *(音楽、効果音ともにOPMタイマ使用時のみに発生する)
  114.     opmwait
  115.     move.b    d0,fm_data_port
  116.     opmwait
  117.     move.w    d7,sr            *srを割り込み発生前に戻す
  118.     bsr    inc_zmint        *音楽演奏処理へ
  119.     move.l    sub_job_entry(pc),a0
  120.     cmpi.l    #'独立',-4(a0)        *"独立"マークがあるとノーチェック
  121.     beq    @f
  122.     tst.l    sp_buf-work(a6)        *異常複数割り込み対処
  123.     bne    exit_int_e
  124. @@:
  125.     jsr    (a0)            *効果音(SUB JOB)処理へ
  126. exit_int_e:
  127.     move.w    sr,d7
  128. exit_int_e1:
  129.     ori.w    #$0700,sr
  130. exit_int_e2:
  131.     move.b    fm_data_port,d0
  132.     andi.w    #3,d0
  133.     bne    int_entry_again
  134.     movem.l    (sp)+,d0-d7/a0-a6
  135.     ei_tmf
  136.     rte                *割り込み処理終了
  137.  
  138. fmint_tbl:
  139.         dc.l    0        *%00:これでエントリすることはあり得ないが、念のため
  140.         dc.l    exit_int_e
  141. tm_a_reset:    dc.w    %0001_1111,0    *%01:timer a
  142. tm_a_entry:    dc.l    int_entry_fm
  143. tm_b_reset:    dc.w    %0010_1111,0    *%10:timer b
  144. tm_b_entry:    dc.l    int_entry_sub
  145. tm_ab_reset:    dc.w    %0011_1111,0    *%11:both timer made overflow.
  146. tm_ab_entry:    dc.l    int_entry_both    *midiタイマの時はint_entry_sub
  147. sub_job_entry:    dc.l    do_se_ope
  148.  
  149. int_entry_fm:                *音楽演奏割り込みエントリ
  150.     move.b    #$14,fm_addr_port
  151.     move.w    fmint_tbl(pc,d0.w),d0
  152.     and.b    timer_mask(pc),d0
  153.     move.b    d0,$14+opmreg(a6)
  154.     opmwait
  155.     move.b    d0,fm_data_port
  156.     opmwait
  157.     move.w    d7,sr            *srを割り込み発生前に戻す
  158. ief_patch:                *MIDIタイマ使用時にはパッチが当たる(NOP_NOP)
  159.     bsr.w    inc_zmint
  160.     bra    exit_int_e
  161.  
  162. int_entry_sub:                *ここは必ずOPMタイマ
  163.     move.b    #$14,fm_addr_port
  164.     move.w    fmint_tbl(pc,d0.w),d0
  165.     and.b    timer_mask(pc),d0
  166.     move.b    d0,$14+opmreg(a6)
  167.     opmwait
  168.     move.b    d0,fm_data_port
  169.     opmwait
  170.  
  171.     move.l    sub_job_entry(pc),a0
  172.     cmpi.l    #'独立',-4(a0)        *"独立"マークがあるとノーチェック
  173.     beq    @f
  174.     tst.l    sp_buf-work(a6)        *異常複数割り込み対処
  175.     bne    exit_int_e2
  176.     cmpa.l    #do_se_ope,a0        *効果音ルーチンの場合は排他処理不要
  177.     beq    @f
  178.     cmpa.l    #smf_entry,a0        *SMF再生ルーチンの場合は排他処理不要
  179.     beq    @f
  180.                     *音楽演奏処理と競合してはまずいケース(ZP3 -K,ZP3 -B)
  181.     tst.b    excint_flg-work(a6)    *排他フラグチェック
  182.     bne    exit_int_e2        *音楽演奏処理中なのでスキップ
  183.     jsr    (a0)            *効果音(SUB JOB)処理へ
  184.     bra    exit_int_e2
  185. @@:                    *音楽演奏と競合しないケース
  186.     move.w    d7,sr            *srを割り込み発生前に戻す
  187.     jsr    (a0)            *効果音(SUB JOB)処理へ
  188.     bra    exit_int_e1
  189.  
  190. int_entry_m:                *MIDI-TIMER割り込みエントリー
  191.     movem.l    d0-d7/a0-a6,-(sp)
  192.     lea    work(pc),a6
  193.     di_tmm
  194.     ori.w    #$0700,sr
  195.     move.w    $003c(sp),d0
  196.     ori.w    #$2000,d0
  197.     st.b    excint_flg-work(a6)    *排他フラグON
  198.     move.w    d0,sr            *SRを割り込み発生前に戻す
  199.     bsr    inc_zmint
  200.     ori.w    #$0700,sr        *全マスク(ZMUSICへの二重割り込み防止)
  201.     clr.b    excint_flg-work(a6)    *排他フラグOFF
  202.     ei_tmm
  203.     movem.l    (sp)+,d0-d7/a0-a6
  204.     rte                *割り込み処理終了
  205.  
  206. int_entry_e:                *プレイバック割り込みエントリ
  207.     movem.l    d0-d7/a0-a6,-(sp)
  208.     lea    work(pc),a6
  209.     di_tme
  210.     ori.w    #$0700,sr
  211.     move.w    $003c(sp),d0
  212.     ori.w    #$2000,d0
  213.     st.b    excint_flg-work(a6)    *排他フラグON
  214.     move.w    d0,sr            *SRを割り込み発生前に戻す
  215.     bsr    inc_zmint
  216.     ori.w    #$0700,sr        *全マスク(ZMUSICへの二重割り込み防止)
  217.     clr.b    excint_flg-work(a6)    *排他フラグOFF
  218.     ei_tme
  219.     movem.l    (sp)+,d0-d7/a0-a6
  220.     rte                *割り込み処理終了
  221.  
  222. check_nc_clock:                *(jump after n clocks)オンの時
  223.     move.l    obtevtjtbl-work+nc_clock(a6),d0
  224.     addq.l    #1,zmusic_int-work(a6)
  225.     cmp.l    zmusic_int(pc),d0    *希望クロックになったか
  226.     bne    inc_zmint_end
  227.     move.l    obtevtjtbl-work+nc_jump(a6),a0        *希望クロックになったら
  228.     jmp    (a0)                    *飛ぶ
  229.  
  230. chfd_move    macro    exit_chfdmv    *チャンネルフェーダー移動処理
  231.     * < a4.l=ch_fader_tbl+n
  232.     * < a2.l=ch_nn_fdp
  233.     * > (a2)=0ならば目的を達成している
  234.     * X d0,d1,a1
  235.     move.b    fd_mode(a2),d0
  236.     cmpi.b    #CH_FADER_RESET,d0
  237.     bne    1f
  238.     cmpi.b    #128,fd_lvlb(a2)    *通常レベル設定はフェーダー移動モード解除を意味する
  239.     bne    exit_chfdmv
  240. chfd_end:                *チャンネルフェーダーテーブルから削除する
  241.     lea    -2(a4),a1
  242. @@:
  243.     move.w    (a1)+,-4(a1)
  244.     bpl    @b
  245.     move.l    a1,a4
  246.     tst.w    ch_fader_tbl-work(a6)
  247.     bpl    exit_chfdmv
  248.     andi.b    #(.not.ff_ch_fader),fader_flag-work(a6)
  249.     bra    exit_chfdmv
  250. 1:
  251.     move.b    fd_dest(a2),d1    *目的値
  252.     tst.b    d0
  253.     beq    exit_chfdmv
  254.                 *以下フェードアウト時
  255.     add.b    d0,fd_lvlb(a2)
  256.     cmp.b    fd_lvlb(a2),d1
  257.     bne    exit_chfdmv    *目的に達していないなら次回も継続
  258.     clr.l    (a2)        *fd_spd,spd2クリア(目的レベルを維持)
  259.     endm
  260.  
  261. mstfd_move    macro    exit_mstfdmv    *マスターフェーダー移動処理
  262.     * < a4=master_fader_tbl+n
  263.     * < a2=mstfd_xx_spd
  264.     * > (a2)=0ならば目的を達成している
  265.     * X d0,d1,a1
  266.     move.b    fd_mode(a2),d0
  267.     cmpi.b    #MASTER_FADER_RESET,d0
  268.     bne    1f
  269.     cmpi.b    #128,fd_lvlb(a2)    *通常レベル設定はフェーダー移動モード解除を意味する
  270.     bne    exit_mstfdmv
  271. mstfd_end:                *マスターフェーダーテーブルから削除する
  272.     lea    -2(a4),a1
  273. @@:
  274.     move.w    (a1)+,-4(a1)
  275.     bpl    @b
  276.     move.l    a1,a4
  277.     tst.w    master_fader_tbl-work(a6)
  278.     bpl    exit_mstfdmv
  279.     andi.b    #(.not.ff_master_fader).and.$ff,fader_flag-work(a6)
  280.     bra    exit_mstfdmv
  281. 1:
  282.     move.b    fd_dest(a2),d1        *目的値
  283.     tst.b    d0
  284.     beq    exit_mstfdmv
  285.                     *以下フェードアウト時
  286.     add.b    d0,fd_lvlb(a2)
  287.     cmp.b    fd_lvlb(a2),d1
  288.     bne    exit_mstfdmv        *目的値に達していないなら次回も継続
  289.     clr.l    (a2)            *fd_spd,spd2クリア(目的レベルを維持)
  290.     endm
  291.  
  292. set_fm_tune    macro
  293.     * < d0.b=midi note number
  294.     * < d5.w=total kf value
  295.     * < d4.b fm ch
  296.     * < a0.l=opmset
  297.     * X d0-d2,d5,a1
  298.     andi.w    #$7f,d0        *最上位ビットがたっている場合もあるからext.wでは駄目
  299.     move.l    fm_tune_tbl-work(a6),d2
  300.     beq    @f
  301.     move.l    d2,a1        *周波数テーブル考慮
  302.     move.b    (a1,d0.w),d2
  303.     ext.w    d2
  304.     add.w    d2,d5
  305. @@:
  306.     addq.w    #5,d5        *4MHz offset
  307.     add.w    p_detune(a5),d5    *get det. param.
  308.     move.w    d5,d2
  309.     asr.w    #6,d5        *d5.w=d5.w/64=kc offset value
  310.     beq    @f
  311.     add.w    d5,d0
  312.     andi.w    #$003f,d2    *d2=アマリ
  313. @@:
  314.     add.b    d2,d2
  315.     add.b    d2,d2        *2つシフト
  316.  
  317.     moveq.l    #$30,d1        *key code
  318.     or.b    d4,d1
  319.     jsr    (a0)        *!opmset(kf)
  320.  
  321.     tst.w    d0
  322.     bge    @f
  323.     moveq.l    #0,d0
  324.     bra    1f
  325. @@:
  326.     cmpi.w    #127,d0
  327.     ble    1f
  328.     moveq.l    #127,d0
  329. 1:
  330.     subq.b    #8,d1        *$28+n
  331.     move.b    key_code_tbl(pc,d0.w),d2
  332.     jsr    (a0)        *!opmset(kc)
  333.     endm
  334.  
  335. inc_zmint:
  336.     *(jump after n clocks)イベント・ON時には(bsr.w check_nc_clock)
  337.     *(SMF転送時には bra smf_entry)
  338.     addq.l    #1,zmusic_int-work(a6)        *4バイトサイズ命令
  339. inc_zmint_end:
  340.                 *アゴーギク処理
  341. agogik_base:    equ    (agogik_work-work)-(pmod_param-track_work)
  342.     tst.b    p_pmod_sw+agogik_base(a6)
  343.     beq    1f
  344.     lea    agogik_base(a6),a5
  345.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  346.     bne    pmdop_2nd
  347.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)    3/15
  348. *!3/15    move.b    #1,p_pmod_chain(a5)        *接続待機
  349. *!    tst.w    p_pmod_dpt_now(a5)
  350. *!    bne    @f
  351. *!    addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  352. *!@@:
  353.     moveq.l    #0,d5
  354.     moveq.l    #0,d6
  355.     bsr    fm_pmod
  356.     bra    @f
  357. pmdop_2nd:                    *2回目以降
  358.     bsr    pmod_ope
  359. @@:
  360.     bsr    do_agogik
  361. 1:
  362.     move.l    play_trk_tbl(pc),a5
  363.     move.b    fader_flag(pc),d6
  364.     beq    mil0
  365. ****************************************MASTER FADER 処理
  366.     bpl    ch_fader        *master fader on?
  367.     lea    mstfd_fm_spd2(pc),a3
  368.     lea    master_fader_tbl(pc),a4
  369. mstfdoplp:
  370.     move.w    (a4)+,d0    *d0 must be 0,8,16,24,32,40 or -1(予めfd_wkl倍してある)
  371.     bmi    ch_fader
  372.     lea    (a3,d0.w),a2
  373.     add.w    d0,d0                *d0*16倍へ
  374.     lea    fo_ch_fm-work(a6,d0.w),a1    *こういうワークは割り込み出口で初期化する
  375.     move.w    fd_spd(a2),d1
  376.     add.w    d1,fd_spd2(a2)
  377.     bcc    mstfdop_nmv
  378.     move.l    #$22222222,d2            *第1ビットオン
  379.     or.l    d2,(a1)+            *16個分セット
  380.     or.l    d2,(a1)+
  381.     or.l    d2,(a1)+
  382.     or.l    d2,(a1)+
  383.     mstfd_move    mstfdoplp
  384.     bra    mstfdoplp
  385. mstfdop_nmv:
  386.     move.l    #$02020202,d2            *第1ビットオン
  387.     or.l    d2,(a1)+            *16個分セット
  388.     or.l    d2,(a1)+
  389.     or.l    d2,(a1)+
  390.     or.l    d2,(a1)+
  391.     bra    mstfdoplp
  392. ****************************************CH FADER 処理
  393. ch_fader:
  394.     add.b    d6,d6            *ch_fader on?
  395.     bpl    mil0
  396.     lea    ch_fm_fdp(pc),a3
  397.     lea    ch_fader_tbl(pc),a4
  398. chflp:
  399.     move.w    (a4)+,d0        *d0 must be 0~95, or -1
  400.     bmi    mil0
  401.     move.w    d0,d1
  402.     lsl.w    #fd_wkl_,d0
  403.     lea    (a3,d0.w),a2
  404.     move.w    fd_spd(a2),d2
  405.     add.w    d2,fd_spd2(a2)
  406.     bcc    chfdop_nmv
  407.     ori.b    #$41,fo_ch_fm-work(a6,d1.w)    *第6ビットON
  408.     chfd_move    chflp
  409.     bra    chflp
  410. chfdop_nmv:
  411.     ori.b    #$01,fo_ch_fm-work(a6,d1.w)    *第0ビットON
  412.     bra    chflp
  413.  
  414. m_int_lp:
  415.     move.l    (a6),a5
  416. mil0:
  417.     moveq.l    #0,d7
  418.     move.w    (a5)+,d7
  419.     bmi    exit_int        *$ffなら未使用
  420. mil_patch:
  421.     nop                *jump系コマンド実行時にパッチ(bsr check_jump?_tr_id)
  422.     move.l    a5,(a6)
  423.     swap    d7
  424.     lsr.l    #16-trwk_size_,d7
  425.     movea.l    seq_wk_tbl(pc),a5
  426.     adda.l    d7,a5            *a5=trk n seq_wk_tbl
  427.     clr.b    p_trk_seq_flg(a5)
  428.     move.l    p_type(a5),d4        *get ch(This is the global value.)
  429.                     *チャンネル・マスク・チェック
  430.     move.w    p_type(a5),d0
  431.     beq    @f
  432.     bmi    chk_md_chmsk
  433.     move.w    ch_mask_ad(pc),d0    *ADPCM
  434.     bra    chmskchk0
  435. @@:                    *FM
  436.     move.w    ch_mask_fm(pc),d0
  437.     bra    chmskchk0
  438.  
  439. check_jump2_tr_id:            *[@]フェーズ2実行ルーチン
  440.     move.l    jump_flg_ptr(pc),a1
  441.     cmp.w    2(a1),d7        *jump_flgの示すトラックIDと今回の実行トラックが等しいか
  442.     beq    end_jump2_mode        *等しいならば走査が一周したことを意味する
  443.     rts
  444.  
  445. check_jump3_tr_id:            *[jump nn]フェーズ2実行ルーチン
  446.     move.l    jump_flg_ptr(pc),a1
  447.     cmp.w    2(a1),d7        *jump_flgの示すトラックIDと今回の実行トラックが等しいか
  448.     beq    end_jump3_mode        *等しいならば走査が一周したことを意味する
  449.     rts
  450.  
  451. chk_md_chmsk:                *MIDI
  452.     add.w    d0,d0
  453.     lea    ch_mask_m0(pc),a1
  454.     move.w    (a1,d0.w),d0
  455. chmskchk0:
  456.     tst.b    p_track_stat(a5)
  457.     bne    m_int_lp        *case:$80 死んでいるならばなにもしない
  458.                     *case:1 演奏終了しているならばなにもしない
  459.                     *p_track_stat(a5)=0だけがint_play_opeへ行ける
  460.                     *同期待ち等は当然演奏処理はスキップ
  461.                     *実際の演奏処理へ
  462.     btst.l    d4,d0
  463.     bne    tr_mask_mode
  464.     tst.b    p_mask_mode(a5)        *check track mask
  465.     bne    tr_mask_mode        *masked
  466.     subq.b    #1,p_trkfrq_wk(a5)    *割り込み比率処理
  467.     bcc    m_int_lp
  468.     move.b    p_trkfrq(a5),p_trkfrq_wk(a5)
  469.     move.l    p_int_play_ope(a5),a1
  470.     jsr    (a1)
  471.     bra    m_int_lp
  472.  
  473. exit_int:                *演奏割り込みルーチンの出口
  474.     move.b    fader_flag(pc),d6
  475.     beq    exit0
  476.     bpl    do_ch_fader
  477. *do_master_fader:
  478.     lea    master_fader_tbl(pc),a0
  479. mfdo_lp:
  480.     move.w    (a0)+,d0        *予めfd_wkl(8)倍してある
  481.     bmi    exit0
  482.     lsr.w    #2,d0            *d0*2倍へ
  483.     move.w    mstfd_jmtb(pc,d0.w),d0
  484.     jmp    mstfd_jmtb(pc,d0.w)
  485. mstfd_jmtb:
  486.     dc.w    mstfd_fm_do-mstfd_jmtb
  487.     dc.w    mstfd_ad_do-mstfd_jmtb
  488.     dc.w    mstfd_m0_do-mstfd_jmtb
  489.     dc.w    mstfd_m1_do-mstfd_jmtb
  490.     dc.w    mstfd_mr0_do-mstfd_jmtb
  491.     dc.w    mstfd_mr1_do-mstfd_jmtb
  492.  
  493. mstfd_fm_do:                *FM音源
  494.     lea    fo_ch_fm+8(pc),a1
  495.     lea    fm_vol_tbl+8(pc),a2
  496.     moveq.l    #8-1,d4            *ch
  497. mf_fm_lp:
  498.     moveq.l    #0,d0
  499.     move.b    -(a2),d0        *get vol
  500.     bmi    _next_mf_fm        *処理不要
  501.     move.b    -(a1),d7        *処理フラグ
  502.     bmi    next_mf_fm        *すでに処理済み
  503.     move.w    d7,d6
  504.     andi.w    #$60,d7
  505.     beq    next_mf_fm        *フェーダー処理不要
  506.     lea    opmset_se(pc),a4
  507.     bsr    do_fm_volume_fdr
  508. next_mf_fm:
  509.     clr.b    (a1)
  510.     dbra    d4,mf_fm_lp
  511.     bra    mfdo_lp
  512. _next_mf_fm:
  513.     clr.b    -(a1)
  514.     dbra    d4,mf_fm_lp
  515.     bra    mfdo_lp
  516.  
  517. mstfd_ad_do:                *ADPCM音源
  518.     lea    fo_ch_ad+16(pc),a1
  519.     lea    ad_vol_tbl+16(pc),a2
  520.     moveq.l    #16-1,d4        *ch
  521. mf_ad_lp:
  522.     moveq.l    #0,d0
  523.     move.b    -(a2),d0        *get vol
  524.     bmi    _next_mf_ad        *処理不要
  525.     move.b    -(a1),d7
  526.     bmi    next_mf_ad        *すでに処理済み
  527.     move.w    d7,d6
  528.     andi.w    #$60,d7
  529.     beq    next_mf_ad        *フェーダー処理不要
  530.     bsr    _do_ad_volume        *フェーダー処理&音量セット
  531. next_mf_ad:
  532.     clr.b    (a1)
  533.     dbra    d4,mf_ad_lp
  534.     bra    mfdo_lp
  535. _next_mf_ad:
  536.     clr.b    -(a1)
  537.     dbra    d4,mf_ad_lp
  538.     bra    mfdo_lp
  539.  
  540. mstfd_do    macro    xx,dvid
  541.     local    mf_lp
  542.     local    next_mf
  543.     local    _next_mf
  544.     move.l    #dvid*65536+16-1,d4    *ch
  545. mf_lp:
  546.     moveq.l    #0,d0
  547.     move.b    -(a2),d0        *get vol
  548.     bmi    _next_mf            *処理不要
  549.     move.b    -(a1),d7
  550.     bmi    next_mf            *すでに処理済み
  551.     move.w    d7,d6
  552.     andi.w    #$60,d7
  553.     beq    next_mf            *フェーダー処理不要
  554.     bsr    consider_fader_md
  555.     move.l    d0,d1
  556.     bsr    do_md_volume_&xx
  557. next_mf:
  558.     clr.b    (a1)            *clear marker
  559.     dbra    d4,mf_lp
  560.     bra    mfdo_lp
  561. _next_mf:
  562.     clr.b    -(a1)            *clear marker
  563.     dbra    d4,mf_lp
  564.     bra    mfdo_lp
  565.     endm
  566.  
  567. mstfd_m0_do:                *MIDI-0
  568.     lea    fo_ch_m0+16(pc),a1
  569.     lea    m0_vol_tbl+16(pc),a2
  570.     mstfd_do    m0,DEV_MIDI1
  571.  
  572. mstfd_m1_do:                *MIDI-1
  573.     lea    fo_ch_m1+16(pc),a1
  574.     lea    m1_vol_tbl+16(pc),a2
  575.     mstfd_do    m1,DEV_MIDI2
  576.  
  577. mstfd_mr0_do:                *MIDI-R0
  578.     lea    fo_ch_mr0+16(pc),a1
  579.     lea    mr0_vol_tbl+16(pc),a2
  580.     mstfd_do    r0,DEV_MIDI3
  581.  
  582. mstfd_mr1_do:                *MIDI-R1
  583.     lea    fo_ch_mr1+16(pc),a1
  584.     lea    mr1_vol_tbl+16(pc),a2
  585.     mstfd_do    r1,DEV_MIDI4
  586.  
  587. do_ch_fader:                *チャンネルフェーダー実行
  588.     lea    ch_fader_tbl(pc),a0
  589.     lea    ch_fm_fdp(pc),a3
  590. cfdo_lp:
  591.     move.w    (a0)+,d6        *0,1,2,3...,95
  592.     bmi    exit0
  593.     move.w    d6,d0
  594.     cmpi.w    #16-1,d0
  595.     bls    case_cfdo_fm
  596.     lea    fo_ch_fm-work(a6,d6.w),a1
  597.     move.b    (a1),d7
  598.     bmi    @f            *処理済み
  599.     add.b    d7,d7            *ch fader ope?
  600.     bpl    @f            *no need
  601.     moveq.l    #0,d1
  602.     move.b    fm_vol_tbl-fo_ch_fm(a1),d1    *get vol
  603.     bmi    @f            *処理不要
  604.     lsl.w    #fd_wkl_,d0
  605.     mulu    fd_lvlw(a3,d0.w),d1
  606.     lsr.l    #7,d1
  607.     move.w    d6,d4
  608.     andi.w    #$0f,d4            *get ch
  609.     lsr.w    #4,d6            */16
  610.     add.w    d6,d6            *2
  611.     move.w    chfd_jmtb(pc,d6.w),d6
  612.     jsr    chfd_jmtb(pc,d6.w)
  613. @@:
  614.     clr.b    (a1)
  615.     bra    cfdo_lp
  616.  
  617. chfd_jmtb:
  618.     dc.w    0
  619.     dc.w    do_ad_volume_-chfd_jmtb
  620.     dc.w    do_md_volume_m0-chfd_jmtb
  621.     dc.w    do_md_volume_m1-chfd_jmtb
  622.     dc.w    do_md_volume_r0-chfd_jmtb
  623.     dc.w    do_md_volume_r1-chfd_jmtb
  624.  
  625. case_cfdo_fm:                *FMの場合特別に
  626.     lea    fo_ch_fm-work(a6,d6.w),a1
  627.     move.b    (a1),d7
  628.     bmi    @f            *処理済み
  629.     add.b    d7,d7            *ch fader ope?
  630.     bpl    @f            *no need
  631.     moveq.l    #0,d0
  632.     move.b    fm_vol_tbl-fo_ch_fm(a1),d0    *get vol
  633.     bmi    @f            *処理不要
  634.     move.w    d6,d4            *get ch
  635.     lea    opmset_se(pc),a4
  636.     bsr    do_fm_volume_fdr
  637. @@:
  638.     clr.b    (a1)
  639.     bra    cfdo_lp
  640.  
  641. exit0:                    *演奏割り込み処理の出口
  642.     rts
  643.  
  644. tr_mask_mode:                *トラック/チャンネル・マスク時
  645.     subq.b    #1,p_trkfrq_wk(a5)    *割り込み比率処理
  646.     bcc    m_int_lp
  647.     move.b    p_trkfrq(a5),p_trkfrq_wk(a5)
  648.     lea    tmm_bak(pc),a1
  649.     move.w    key_on_fm_patch(pc),(a1)+    *パッチ先を保存
  650.     move.w    key_on_ad_patch(pc),(a1)+
  651.     move.w    key_on_md_patch(pc),(a1)+
  652.     patch_w    BRA,key_on_fm_patch,do_fmhlo
  653.     move.w    #RTS,key_on_ad_patch-work(a6)
  654.     patch_w    BRA,key_on_md_patch,konmdlp
  655.     bsr    cache_flush
  656.  
  657.     move.l    p_int_play_ope(a5),a1
  658.     jsr    (a1)
  659.  
  660.     lea    tmm_bak(pc),a1
  661.     move.w    (a1)+,key_on_fm_patch-work(a6)
  662.     move.w    (a1)+,key_on_ad_patch-work(a6)
  663.     move.w    (a1)+,key_on_md_patch-work(a6)
  664.     bsr    cache_flush
  665.     bra    m_int_lp
  666.  
  667. tmm_bak:
  668.     ds.l    3
  669.  
  670. consider_fader_fm_n:            *FADERを考慮したボリューム値を決める(FM)
  671.     * < d4.w=ch            *ノイズオシレータ専用ルーチン
  672.     * < d0.w=source vol(0-127)
  673.     * > d0.w=true volume(127-0)
  674.     * - all
  675. reglist    reg    d1/d3-d4/a3-a4
  676.     movem.l    reglist,-(sp)
  677.     lea    fmtlcnvtbl_n(pc),a3
  678.     bra    @f
  679.  
  680. consider_fader_fm:            *FADERを考慮したボリューム値を決める(FM)
  681.     * < d4.w=ch
  682.     * < d0.w=source vol(0-127)
  683.     * > d0.w=true volume(127-0)
  684.     * - all
  685. reglist    reg    d1/d3-d4/a3-a4
  686.     movem.l    reglist,-(sp)
  687.     lea    fmtlcnvtbl(pc),a3    *!linear
  688. @@:
  689.     lea    fm_vol_tbl(pc),a4
  690.     add.w    d4,a4
  691.     move.b    d0,(a4)            *ボリュームをしまう
  692.     move.b    fo_ch_fm-fm_vol_tbl(a4),d1
  693.     beq    exit_csfm
  694.     tas.b    fo_ch_fm-fm_vol_tbl(a4)
  695.     moveq.l    #0,d3
  696.     lsr.b    #1,d1
  697.     bcc    @f
  698.     lsl.w    #fd_wkl_,d4
  699.     lea    ch_fm_fdp(pc),a4
  700.     move.w    fd_lvlw(a4,d4.w),d4    *!linear
  701.     add.w    d4,d4            *!linear
  702.     mulu    (a3,d4.w),d0        *!linear
  703.     addq.w    #7,d3
  704. @@:
  705.     lsr.b    #1,d1                *master fader ope
  706.     bcc    @f
  707.     move.w    mstfd_fm_lvlw(pc),d4    *!linear
  708.     add.w    d4,d4            *!linear
  709.     mulu    (a3,d4.w),d0        *!linear
  710.     addq.w    #7,d3
  711. @@:
  712.     lsr.l    d3,d0
  713. exit_csfm:
  714.     movem.l    (sp)+,reglist
  715.     eori.w    #$7f,d0                *127-0
  716.     rts
  717.  
  718. fmtlcnvtbl:    *線形変化→指数変化変換テーブル
  719. *    dc.w    $00,$0c,$18,$25,$31,$3e,$4a,$57        *BY ZEN
  720. *    dc.w    $58,$58,$58,$59,$59,$59,$5a,$5a
  721. *    dc.w    $5a,$5b,$5b,$5b,$5c,$5c,$5c,$5d
  722. *    dc.w    $5d,$5d,$5e,$5e,$5e,$5f,$5f,$5f
  723. *    dc.w    $60,$60,$60,$61,$61,$61,$62,$62
  724. *    dc.w    $62,$63,$63,$63,$64,$64,$64,$65
  725. *    dc.w    $65,$65,$66,$66,$66,$67,$67,$67
  726. *    dc.w    $68,$68,$68,$69,$69,$69,$6a,$6a
  727. *    dc.w    $6a,$6a,$6b,$6b,$6b,$6c,$6c,$6c
  728. *    dc.w    $6d,$6d,$6d,$6e,$6e,$6e,$6f,$6f
  729. *    dc.w    $6f,$70,$70,$70,$71,$71,$71,$72
  730. *    dc.w    $72,$72,$73,$73,$73,$74,$74,$74
  731. *    dc.w    $75,$75,$75,$76,$76,$76,$77,$77
  732. *    dc.w    $77,$78,$78,$78,$79,$79,$79,$7a
  733. *    dc.w    $7a,$7a,$7b,$7b,$7b,$7c,$7c,$7c
  734. *    dc.w    $7d,$7d,$7d,$7e,$7e,$7e,$7f,$7f
  735. *    dc.w    $80
  736.  
  737.         .dc.w     0, 20, 33, 41, 47, 54, 58, 63, 66, 70, 73, 76, 78, 81, 83, 84
  738.         .dc.w    86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 95, 96, 96, 97
  739.         .dc.w    97, 97, 98, 98, 98, 99, 99,100,100,100,101,101,101,102,102,102
  740.         .dc.w   103,103,103,104,104,104,105,105,105,105,106,106,106,107,107,107
  741.         .dc.w   108,108,108,109,109,109,109,110,110,110,111,111,111,112,112,112
  742.         .dc.w   112,113,113,113,114,114,114,115,115,115,116,116,116,116,117,117
  743.         .dc.w   117,118,118,118,119,119,119,119,120,120,120,121,121,121,122,122
  744.         .dc.w   122,123,123,123,123,124,124,124,125,125,125,126,126,126,127,127
  745.         .dc.w   128
  746.  
  747. fmtlcnvtbl_n:
  748.         .dc.w     0,  0,  1,  1,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  5
  749.         .dc.w     5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,  9
  750.         .dc.w     9,  9,  9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14
  751.         .dc.w    14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21
  752.         .dc.w    22, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33
  753.         .dc.w    34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51, 52
  754.         .dc.w    53, 55, 56, 58, 60, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81
  755.         .dc.w    83, 85, 87, 90, 92, 95, 97,100,103,106,109,112,115,119,123,127
  756.         .dc.w   128
  757.  
  758. consider_fader_ad:            *FADERを考慮したボリューム値を決める(ADPCM)
  759.     * < d4.w=ch
  760.     * < d0.w=source vol(0-127)
  761.     * > d0.w=true volume(0-127)
  762.     * - all
  763. reglist    reg    d1/d3-d4/a4
  764.     movem.l    reglist,-(sp)
  765.     lea    ad_vol_tbl(pc),a4
  766.     add.w    d4,a4
  767.     move.b    d0,(a4)                *ボリュームをしまう
  768. cfa_patch:
  769.     moveq.l    #127,d0                *非MPCM.XモードではNOP
  770.     move.b    fo_ch_ad-ad_vol_tbl(a4),d1
  771.     beq    exit_csad
  772.     tas.b    fo_ch_ad-ad_vol_tbl(a4)
  773.     moveq.l    #0,d3
  774.     lsr.b    #1,d1
  775.     bcc    @f
  776.     lsl.w    #fd_wkl_,d4
  777.     lea    ch_ad_fdp(pc),a4
  778.     mulu    fd_lvlw(a4,d4.w),d0
  779.     addq.w    #7,d3
  780. @@:
  781.     lsr.b    #1,d1                *master fader ope
  782.     bcc    @f
  783.     mulu    mstfd_ad_lvlw(pc),d0
  784.     addq.w    #7,d3
  785. @@:
  786.     lsr.l    d3,d0
  787. exit_csad:
  788.     movem.l    (sp)+,reglist
  789.     rts
  790.  
  791. consider_fader_md:            *FADERを考慮したボリューム値を決める(MIDI)
  792.     * < d4.w=ch
  793.     * < d0.w=source vol(0-127)
  794.     * > d0.w=true volume(0-127)
  795.     * - all
  796. reglist    reg    d1/d3-d4/a4
  797.     movem.l    reglist,-(sp)
  798.     move.l    d4,d1
  799.     swap    d1
  800. @@:
  801.     add.w    d1,d1
  802.     move.w    cfmjtbl+2(pc,d1.w),d1
  803.     jmp    cfmjtbl(pc,d1.w)
  804. cfmjtbl:
  805.     dc.w    cfm_mX-cfmjtbl
  806.     dc.w    cfm_m0-cfmjtbl
  807.     dc.w    cfm_m1-cfmjtbl
  808.     dc.w    cfm_mr0-cfmjtbl
  809.     dc.w    cfm_mr1-cfmjtbl
  810. cfm_mX:
  811.     move.w    current_midi_out_w(pc),d1
  812.     bra    @b
  813. cfm_m0:
  814.     lea    m0_vol_tbl(pc),a4
  815.     add.w    d4,a4
  816.     move.b    d0,(a4)                *ボリュームをしまう
  817.     move.b    fo_ch_m0-m0_vol_tbl(a4),d1
  818.     beq    exit_csm0
  819.     tas.b    fo_ch_m0-m0_vol_tbl(a4)
  820.     moveq.l    #0,d3
  821.     lsr.b    #1,d1
  822.     bcc    @f
  823.     lsl.w    #fd_wkl_,d4
  824.     lea    ch_m0_fdp(pc),a4
  825.     mulu    fd_lvlw(a4,d4.w),d0
  826.     addq.w    #7,d3
  827. @@:
  828.     lsr.b    #1,d1                *master fader ope
  829.     bcc    @f
  830.     mulu    mstfd_m0_lvlw(pc),d0
  831.     addq.w    #7,d3
  832. @@:
  833.     lsr.l    d3,d0
  834. exit_csm0:
  835.     movem.l    (sp)+,reglist
  836.     rts
  837.  
  838. cfm_m1:
  839.     lea    m1_vol_tbl(pc),a4
  840.     add.w    d4,a4
  841.     move.b    d0,(a4)                *ボリュームをしまう
  842.     move.b    fo_ch_m1-m1_vol_tbl(a4),d1
  843.     beq    exit_csm1
  844.     tas.b    fo_ch_m1-m1_vol_tbl(a4)
  845.     moveq.l    #0,d3
  846.     lsr.b    #1,d1
  847.     bcc    @f
  848.     lsl.w    #fd_wkl_,d4
  849.     lea    ch_m1_fdp(pc),a4
  850.     mulu    fd_lvlw(a4,d4.w),d0
  851.     addq.w    #7,d3
  852. @@:
  853.     lsr.b    #1,d1                *master fader ope
  854.     bcc    @f
  855.     mulu    mstfd_m1_lvlw(pc),d0
  856.     addq.w    #7,d3
  857. @@:
  858.     lsr.l    d3,d0
  859. exit_csm1:
  860.     movem.l    (sp)+,reglist
  861.     rts
  862.  
  863. cfm_mr0:
  864.     lea    mr0_vol_tbl(pc),a4
  865.     add.w    d4,a4
  866.     move.b    d0,(a4)                *ボリュームをしまう
  867.     move.b    fo_ch_mr0-mr0_vol_tbl(a4),d1
  868.     beq    1f
  869.     tas.b    fo_ch_mr0-mr0_vol_tbl(a4)
  870.     moveq.l    #0,d3
  871.     lsr.b    #1,d1
  872.     bcc    @f
  873.     lsl.w    #fd_wkl_,d4
  874.     lea    ch_mr0_fdp(pc),a4
  875.     mulu    fd_lvlw(a4,d4.w),d0
  876.     addq.w    #7,d3
  877. @@:
  878.     lsr.b    #1,d1                *master fader ope
  879.     bcc    @f
  880.     mulu    mstfd_mr0_lvlw(pc),d0
  881.     addq.w    #7,d3
  882. @@:
  883.     lsr.l    d3,d0
  884. 1:
  885.     movem.l    (sp)+,reglist
  886.     rts
  887.  
  888. cfm_mr1:
  889.     lea    mr1_vol_tbl(pc),a4
  890.     add.w    d4,a4
  891.     move.b    d0,(a4)                *ボリュームをしまう
  892.     move.b    fo_ch_mr1-mr1_vol_tbl(a4),d1
  893.     beq    1f
  894.     tas.b    fo_ch_mr1-mr1_vol_tbl(a4)
  895.     moveq.l    #0,d3
  896.     lsr.b    #1,d1
  897.     bcc    @f
  898.     lsl.w    #fd_wkl_,d4
  899.     lea    ch_mr1_fdp(pc),a4
  900.     mulu    fd_lvlw(a4,d4.w),d0
  901.     addq.w    #7,d3
  902. @@:
  903.     lsr.b    #1,d1                *master fader ope
  904.     bcc    @f
  905.     mulu    mstfd_mr1_lvlw(pc),d0
  906.     addq.w    #7,d3
  907. @@:
  908.     lsr.l    d3,d0
  909. 1:
  910.     movem.l    (sp)+,reglist
  911.     rts
  912.  
  913. port_ope    macro            *ポルタメント処理
  914.     * X d0
  915.     move.l    p_port_step(a5),d0
  916.     add.l    d0,p_port_pitch(a5)
  917.     endm
  918.  
  919. pmod_ope:                *ピッチモジュレーションパラメータ演算処理
  920.     * X d0-d2,a1            *(含む波形接続処理)
  921.     btst.b    #b_pmod_wvsq,p_pmod_flg(a5)    *波形進行音符毎モードか
  922.     beq    @f
  923.     cmpi.w    #1,(a5)
  924.     bne    exit_pmod_ope
  925.     btst.b    #b_pmod_wvsqrst,p_pmod_flg(a5)
  926.     bne    @f
  927.     movea.l    p_data_pointer(a5),a1    *compiled data address
  928.     cmpi.b    #rest_zmd,(a1)
  929.     beq    exit_pmod_ope        *休符では更新せず
  930.     subq.w    #1,p_pmod_syncnt2(a5)
  931.     bne    exit_pmod_ope
  932.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  933. @@:
  934.     subq.w    #1,p_pmod_dly2(a5)
  935.     bne    pm_chain?
  936.     moveq.l    #0,d0
  937.     move.b    p_pmod_n(a5),d0
  938.     addq.b    #1,d0            *-1.bでエントリのケースもあり(だから.b)
  939.     cmpi.b    #7,d0
  940.     bhi    pm_chain?        *最後のを継続して使用
  941.     move.b    d0,p_pmod_n(a5)
  942.     btst.b    d0,p_pmod_omt(a5)    *省略の場合は前回のものを継続
  943.     beq    po0
  944.     add.w    d0,d0
  945.     move.w    p_pmod_dpt_tbl(a5,d0.w),p_pmod_dpt_now(a5)
  946.     move.w    p_pmod_8st_tbl(a5,d0.w),p_pmod_dly2(a5)
  947.     move.w    p_pmod_spd_tbl(a5,d0.w),d2    *次の波形生成パラメータ
  948.     bne    @f
  949.     move.w    p_pmod_spd(a5),d2
  950. @@:
  951.     add.w    d0,d0
  952.     move.l    p_pmod_stp_tbl(a5,d0.w),d1    *次の波形生成パラメータ
  953.     tst.b    p_pmod_chain(a5)
  954.     bne    check_cnct_pm
  955. go_connect_pm:                *波形接続へ
  956.     move.w    p_pmod_wf(a5),d0    *波形タイプ検査
  957.     bmi    smt_pm_us
  958.     add.w    d0,d0
  959.     move.w    smtp(pc,d0.w),d0
  960.     jmp    smtp(pc,d0.w)
  961. smtp:    dc.w    smt_swp-smtp        *case0:saw
  962.     dc.w    smt_sqp-smtp        *case1:squ
  963.     dc.w    smt_trp-smtp        *case2:tri
  964.     dc.w    smt_swp2-smtp        *case3:sp_saw
  965.     dc.w    smt_pm_ns-smtp        *case4:noise
  966. po0:
  967.     add.w    d0,d0
  968.     move.w    p_pmod_8st_tbl(a5,d0.w),p_pmod_dly2(a5)
  969.     bra    fmpmod1
  970. pm_chain?:
  971.     move.b    p_pmod_chain(a5),d0
  972.     beq    exit_pmod_ope        *「0:即接続」ならばディレイ処理
  973.     bmi    fmpmod1            *「-1:波形接続処理ずみ」ならば継続
  974.     move.l    p_pmod_step_next(a5),d1    *次の波形生成パラメータ
  975.     move.w    p_pmod_spd_next(a5),d2
  976.     subq.b    #1,d0            *1 or 2?
  977.     beq    @f            *case:1
  978.     tst.b    p_pmod_n(a5)        *case:2(=初回)
  979.     bmi    exit_pmod_ope        *delayケース
  980.     bra    go_connect_pm
  981.  
  982. check_cnct_pm:                *波形接続チェック
  983.     move.l    d1,p_pmod_step_next(a5)    *次の波形生成パラメータを
  984.     move.w    d2,p_pmod_spd_next(a5)    *セットする。
  985.     cmpi.b    #2,p_pmod_chain(a5)    *初回ケース
  986.     beq    go_connect_pm
  987. @@:
  988.     move.w    p_pmod_wf(a5),d0    *波形タイプ検査
  989.     bmi    chk_smt_pm_us
  990.     add.w    d0,d0
  991.     move.w    smtp2(pc,d0.w),d0
  992.     jmp    smtp2(pc,d0.w)
  993. smtp2:    dc.w    chk_smt_swp-smtp2    *case0:saw
  994.     dc.w    chk_smt_sqp-smtp2    *case1:squ
  995.     dc.w    chk_smt_trp-smtp2    *case2:trp
  996.     dc.w    chk_smt_swp2-smtp2    *case3:sp_saw
  997.     dc.w    chk_smt_pm_ns-smtp2    *case4:noise
  998.  
  999. chk_smt_swp:                *ノコギリ波の接続チェック
  1000.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1001.     beq    pm_chain
  1002.     move.w    p_pmod_wf2(a5),d0
  1003.     subq.w    #1,d0            *case:sq
  1004.     beq    @f
  1005.     subq.w    #1,d0            *case:tri
  1006.     beq    1f
  1007.     bra    go_connect_pm        *波形接続へ
  1008. @@:                    *case:sq->sw
  1009.     move.l    p_pmod_pitch(a5),d0
  1010.     eor.l    d1,d0
  1011.     bmi    go_connect_pm        *波形接続へ
  1012.     bra    pm_chain
  1013. 1:                    *case:tr->sw
  1014.     move.l    p_pmod_step2(a5),d0
  1015.     eor.l    d1,d0
  1016.     bpl    go_connect_pm        *波形接続へ
  1017.     bra    pm_chain
  1018.  
  1019. smt_swp:                *ノコギリ波の接続
  1020.     move.w    p_pmod_wf(a5),d0
  1021.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1022.     clr.l    p_pmod_pitch(a5)
  1023.     move.w    d2,p_pmod_spd(a5)
  1024.     move.w    d2,p_pmod_spd2(a5)
  1025.     cmpi.b    #2,p_pmod_chain(a5)
  1026.     beq    1f
  1027.     move.l    d1,p_pmod_step2(a5)
  1028.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1029.     cmp.w    p_pmod_wf2(a5),d0
  1030.     beq    @f
  1031.     cmpi.w    #2,p_pmod_wf2(a5)
  1032.     beq    @f            *三角波も同系とみなす
  1033.     move.w    d0,p_pmod_wf2(a5)
  1034.     rts
  1035. @@:                    *同波形ならば0のダブリは余計
  1036.     move.w    d0,p_pmod_wf2(a5)
  1037.     bra    fmpmod1
  1038. 1:
  1039.     move.w    d0,p_pmod_wf2(a5)
  1040.     move.l    d1,p_pmod_step2(a5)
  1041.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1042.     bra    fmpmod1
  1043.  
  1044. chk_smt_sqp:                *矩形波の接続チェック
  1045.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1046.     beq    pm_chain
  1047.     move.w    p_pmod_wf2(a5),d0
  1048.     subq.w    #1,d0            *case:sq
  1049.     beq    @f
  1050.     subq.w    #1,d0            *case:tri
  1051.     beq    1f
  1052.     bra    go_connect_pm        *三角波、矩形波以外ならば波形接続へ
  1053. @@:                    *case:sq->sq
  1054.     move.l    p_pmod_pitch(a5),d0
  1055.     eor.l    d1,d0            *矩形波は±が交互にならなければ見送り
  1056.     bmi    go_connect_pm        *波形接続へ
  1057.     bra    pm_chain
  1058. 1:                    *case:tr->sq
  1059.     move.l    p_pmod_step2(a5),d0
  1060.     eor.l    d1,d0
  1061.     bpl    go_connect_pm        *波形接続へ
  1062.     bra    pm_chain
  1063. smt_sqp:                *矩形波の接続
  1064.     move.w    p_pmod_wf(a5),p_pmod_wf2(a5)
  1065.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1066.     move.l    d1,p_pmod_pitch(a5)
  1067.     move.w    d2,p_pmod_spd(a5)
  1068.     move.w    d2,p_pmod_spd2(a5)
  1069.     cmpi.b    #2,p_pmod_chain(a5)
  1070.     beq    @f
  1071.     move.l    d1,p_pmod_step2(a5)
  1072.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1073. exit_pmod_ope:
  1074.     rts
  1075. @@:                    *初回時のみ特別処理
  1076.     move.l    d1,p_pmod_step2(a5)
  1077.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1078.     bra    fmpmod1
  1079.  
  1080. chk_smt_trp:                *三角波の接続チェック
  1081.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1082.     beq    pm_chain
  1083.     move.w    p_pmod_wf2(a5),d0
  1084.     subq.w    #1,d0            *case:sq
  1085.     beq    1f
  1086.     subq.w    #1,d0            *case:tr
  1087.     beq    @f
  1088.     bra    go_connect_pm        *三角波、矩形波以外ならば波形接続へ
  1089. @@:                    *case:tr->tr
  1090.     move.l    p_pmod_step2(a5),d0    *get 整数部分
  1091.     eor.l    d1,d0            *方向が逆だと見送る
  1092.     bpl    go_connect_pm        *波形接続へ
  1093.     bra    pm_chain
  1094. 1:                    *case:sq->tr
  1095.     move.l    p_pmod_pitch(a5),d0    *get 整数部分
  1096.     eor.l    d1,d0            *方向が逆だと見送る
  1097.     bmi    go_connect_pm        *波形接続へ
  1098.     bra    pm_chain
  1099.  
  1100. smt_trp:                *三角波の接続
  1101.     move.w    p_pmod_wf(a5),d0
  1102.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1103.     clr.l    p_pmod_pitch(a5)
  1104.     move.w    d2,p_pmod_spd(a5)
  1105.     lsr.w    d2
  1106.     move.w    d2,p_pmod_spd2(a5)
  1107.     cmpi.b    #2,p_pmod_chain(a5)
  1108.     beq    1f
  1109.     move.l    d1,p_pmod_step2(a5)
  1110.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1111.     cmp.w    p_pmod_wf2(a5),d0
  1112.     beq    @f
  1113.     tst.w    p_pmod_wf2(a5)
  1114.     beq    @f            *ノコギリ波も同系とみなす
  1115.     move.w    d0,p_pmod_wf2(a5)
  1116.     rts
  1117. @@:                    *同波形ならば0のダブリは余計
  1118.     move.w    d0,p_pmod_wf2(a5)
  1119.     bra    fmpmod1
  1120. 1:                    *初回は特別処理
  1121.     move.w    d0,p_pmod_wf2(a5)
  1122.     move.l    d1,p_pmod_step2(a5)
  1123.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1124.     bra    fmpmod1
  1125.  
  1126. chk_smt_swp2:                *ノコギリ波2の接続チェック
  1127.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1128.     beq    pm_chain
  1129.     move.w    p_pmod_wf2(a5),d0
  1130.     subq.w    #1,d0            *case:sq
  1131.     beq    @f
  1132.     subq.w    #1,d0            *case:tri
  1133.     beq    1f
  1134.     bra    go_connect_pm        *波形接続へ
  1135. @@:                    *case:sq->sw2
  1136.     move.l    p_pmod_pitch(a5),d0
  1137.     eor.l    d1,d0
  1138.     bmi    go_connect_pm        *波形接続へ
  1139.     bra    pm_chain
  1140. 1:                    *case:tr->sw2
  1141.     move.l    p_pmod_step2(a5),d0
  1142.     eor.l    d1,d0
  1143.     bpl    go_connect_pm        *波形接続へ
  1144.     bra    pm_chain
  1145.  
  1146. smt_swp2:                *ノコギリ波2の接続
  1147.     move.w    p_pmod_wf(a5),d0
  1148.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1149.     clr.l    p_pmod_pitch(a5)
  1150.     move.w    d2,p_pmod_spd(a5)
  1151.     move.w    d2,p_pmod_spd2(a5)
  1152.     cmpi.b    #2,p_pmod_chain(a5)
  1153.     beq    1f
  1154.     move.l    d1,p_pmod_step2(a5)
  1155.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1156.     cmp.w    p_pmod_wf2(a5),d0
  1157.     beq    @f
  1158.     cmpi.w    #2,p_pmod_wf2(a5)
  1159.     beq    @f            *三角波も同系とみなす
  1160.     move.w    d0,p_pmod_wf2(a5)
  1161.     rts
  1162. @@:                    *同波形ならば0のダブリは余計
  1163.     move.w    d0,p_pmod_wf2(a5)
  1164.     bra    fmpmod1
  1165. 1:
  1166.     move.w    d0,p_pmod_wf2(a5)
  1167.     move.l    d1,p_pmod_step2(a5)
  1168.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1169.     bra    fmpmod1
  1170.  
  1171. chk_smt_pm_ns:
  1172.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1173.     beq    pm_chain
  1174.     bra    go_connect_pm        *波形接続へ
  1175. smt_pm_ns:                *ノイズの場合は即接続
  1176.     move.w    p_pmod_wf(a5),p_pmod_wf2(a5)
  1177.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1178.     move.w    d2,p_pmod_spd(a5)
  1179.     lsr.w    d2
  1180.     move.w    d2,p_pmod_spd2(a5)
  1181.     move.l    d1,p_pmod_step2(a5)
  1182.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1183.     bsr    get_rand
  1184.     swap    d1
  1185.     muls.w    d1,d0
  1186.     swap    d0            *(1/65536)*2
  1187.     add.w    d0,d0            *→/32768
  1188.     move.w    d0,p_pmod_pitch(a5)
  1189.     rts
  1190.  
  1191. chk_smt_pm_us:
  1192.     btst.b    #b_pmod_syncok,p_pmod_flg(a5)
  1193.     beq    pm_chain
  1194.     bra    go_connect_pm        *波形接続へ
  1195. smt_pm_us:                *波形メモリの場合は即接続
  1196.     move.w    p_pmod_wf(a5),p_pmod_wf2(a5)
  1197.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1198.     clr.b    p_altp_flg(a5)        *反復モードスイッチオフ
  1199.     move.w    d2,p_pmod_spd(a5)
  1200.     lsr.w    d2
  1201.     move.w    d2,p_pmod_spd2(a5)
  1202.     move.l    d1,p_pmod_step2(a5)
  1203.     sne    p_pmod_chain(a5)    *振幅0ならばp_pmod_chain=0
  1204.     move.l    p_wvpm_start(a5),p_wvpm_point(a5)
  1205.     move.l    p_wvpm_lptm(a5),p_wvpm_lptm2(a5)
  1206.     bra    fmpmod1
  1207.  
  1208. pm_chain:                *今回は接続不能,次回へ期待
  1209.     move.b    #1,p_pmod_chain(a5)
  1210. fmpmod1:
  1211. *-------実際のモジュレーション処理-------
  1212.     move.w    p_pmod_wf2(a5),d1    *波形タイプチェック
  1213.     bmi    pmod_wvmm
  1214.     add.w    d1,d1
  1215.     move.w    fmp1(pc,d1.w),d1
  1216.     jmp    fmp1(pc,d1.w)
  1217. fmp1:    dc.w    pmod_noko-fmp1
  1218.     dc.w    pmod_kukei-fmp1
  1219.     dc.w    pmod_sankaku-fmp1
  1220.     dc.w    pmod_noko2-fmp1
  1221.     dc.w    pmod_noise-fmp1
  1222. pmod_wvmm:                *波形メモリ
  1223.     * d6 d7 a4 破壊禁止
  1224.     move.b    p_altp_flg(a5),d0
  1225.     bmi    alternative_ope
  1226.     move.l    p_wvpm_point(a5),a1
  1227.     move.w    (a1)+,d1
  1228.     ext.l    d1
  1229. pmod_wvmm_patch:            *コンパチモードではパッチ(bra store_pmod_wvmm)
  1230.     move.w    p_pmod_step2(a5),d2
  1231.     muls.w    d2,d1            *step2が振幅に相当
  1232.     asr.l    #8,d1            */256
  1233. store_pmod_wvmm:
  1234.     reduce_range_l    d1,-32768,32767
  1235.     move.w    d1,p_pmod_pitch(a5)
  1236.     subq.w    #1,p_pmod_spd2(a5)
  1237.     bne    exit_pmus
  1238.     move.w    p_pmod_spd(a5),d1
  1239.     lsr.w    #1,d1            *d1=d1/2
  1240.     move.w    d1,p_pmod_spd2(a5)    *init speed work
  1241.     bsr    pmod_wvdpn_ope
  1242.     tst.b    d0
  1243.     bne    @f            *case:+1
  1244.     cmp.l    p_wvpm_lped(a5),a1
  1245.     bne    svwvpm
  1246.     tst.b    p_wvpm_lpmd(a5)        *-1 one shot,0 repeat,+1 alternative
  1247.     bmi    oneshot_pm
  1248.     beq    repeat_pm
  1249. alternative_pm:
  1250.     st.b    p_altp_flg(a5)
  1251. oneshot_pm:
  1252.     subq.w    #2,a1
  1253. svwvpm:
  1254.     move.l    a1,p_wvpm_point(a5)
  1255.     rts
  1256. @@:                    *終了フェーズ
  1257.     cmp.l    p_wvpm_end(a5),a1
  1258.     beq    oneshot_pm        *もう終わりだ
  1259.     move.l    a1,p_wvpm_point(a5)
  1260. exit_pmus:
  1261.     rts
  1262. repeat_pm:                *先頭からのくり返しケース
  1263.     tst.l    p_wvpm_lptm2(a5)
  1264.     beq    @f
  1265.     subq.l    #1,p_wvpm_lptm2(a5)
  1266.     bne    @f
  1267.     move.b    #1,p_altp_flg(a5)
  1268. @@:
  1269.     move.l    p_wvpm_lpst(a5),p_wvpm_point(a5)
  1270.     rts
  1271. alternative_ope:
  1272.     move.l    p_wvpm_point(a5),a1
  1273.     move.w    -(a1),d1
  1274.     move.w    p_pmod_step2(a5),d2
  1275.     muls.w    d2,d1
  1276.     asr.l    #8,d1            */256
  1277.     move.w    d1,p_pmod_pitch(a5)
  1278.     subq.w    #1,p_pmod_spd2(a5)
  1279.     bne    exit_pmus
  1280.     move.w    p_pmod_spd(a5),d1
  1281.     lsr.w    #1,d1            *d1=d1/2
  1282.     move.w    d1,p_pmod_spd2(a5)    *init speed work
  1283.     bsr    pmod_wvdpn_ope
  1284.     cmp.l    p_wvpm_lpst(a5),a1
  1285.     bne    svwvpm
  1286.     move.l    p_wvpm_lptm2(a5),d0
  1287.     beq    @f
  1288.     subq.l    #1,p_wvpm_lptm2(a5)
  1289.     bne    @f
  1290.     moveq.l    #1,d0
  1291. @@:
  1292.     move.b    d0,p_altp_flg(a5)    *d0=0ならば順方向再開,d0=1ならば最終フェーズへ
  1293.     addq.w    #2,a1
  1294.     bra    svwvpm
  1295.  
  1296. pmod_wvdpn_ope:                *PMOD振幅増減モード処理
  1297.     * - d0
  1298.     addq.w    #1,p_pmod_rndcnt(a5)
  1299.     move.w    p_pmod_rndcnt(a5),d1
  1300.     cmp.w    p_pmod_dpnspd(a5),d1    *指定周期になったか
  1301.     bne    exit_pmdpn
  1302.     clr.w    p_pmod_rndcnt(a5)
  1303.     move.w    p_pmod_dpnrpt(a5),d1    *無限ループ
  1304.     beq    @f
  1305.     cmp.w    p_pmod_dpntime(a5),d1
  1306.     beq    exit_pmdpn
  1307.     addq.w    #1,p_pmod_dpntime(a5)
  1308. @@:
  1309.     move.w    p_pmod_dpndpt(a5),d1
  1310.     ext.l    d1
  1311.     ext.l    d2
  1312.     bpl    pmwvdptpls
  1313.     sub.l    d1,d2            *振幅増減処理
  1314.     bmi    stnewpmstp2
  1315.     tst.l    d1
  1316.     bmi    @f
  1317.     move.l    #8000,d2
  1318.     bra    stnewpmstp2
  1319. pmwvdptpls:
  1320.     add.l    d1,d2            *振幅増減処理
  1321.     bpl    stnewpmstp2
  1322.     tst.l    d1
  1323.     bmi    @f
  1324.     move.l    #$7fff,d2
  1325.     bra    stnewpmstp2
  1326. @@:                    *振幅0へ
  1327.     moveq.l    #0,d2
  1328. stnewpmstp2:
  1329.     move.w    d2,p_pmod_step2(a5)
  1330. exit_pmdpn:
  1331.     rts
  1332.  
  1333. pmod_noko:                *鋸歯波
  1334.     subq.w    #1,p_pmod_spd2(a5)
  1335.     beq    2f
  1336.     move.l    p_pmod_pitch(a5),d2
  1337.     bmi    @f
  1338.     add.l    p_pmod_step2(a5),d2
  1339.     bpl    1f
  1340.     tst.b    p_pmod_step2(a5)
  1341.     bmi    1f
  1342.     move.l    #$7fff_ffff,d2
  1343.     bra    1f
  1344. @@:
  1345.     add.l    p_pmod_step2(a5),d2
  1346.     bmi    1f
  1347.     tst.b    p_pmod_step2(a5)
  1348.     bpl    1f
  1349.     move.l    #$8000_0000,d2
  1350. 1:
  1351.     move.l    d2,p_pmod_pitch(a5)
  1352.     bra    exit_pmnk
  1353. 2:
  1354.     move.l    p_pmod_pitch(a5),d2
  1355.     neg.l    d2
  1356.     move.w    p_pmod_spd(a5),d1
  1357.     addq.w    #1,p_pmod_rndcnt(a5)
  1358.     move.w    p_pmod_rndcnt(a5),d0
  1359.     cmp.w    p_pmod_dpnspd(a5),d0    *指定周期になったか
  1360.     bne    normal_pmnk
  1361.     clr.w    p_pmod_rndcnt(a5)
  1362.     move.w    p_pmod_dpnrpt(a5),d0    *無限ループ
  1363.     beq    @f
  1364.     cmp.w    p_pmod_dpntime(a5),d0
  1365.     beq    normal_pmnk
  1366.     addq.w    #1,p_pmod_dpntime(a5)
  1367. @@:
  1368.     move.w    p_pmod_dpndpt(a5),d0
  1369.     swap    d2
  1370.     bpl    pmnk_pls
  1371.     sub.w    d0,d2
  1372.     bmi    @f
  1373.     tst.w    d0
  1374.     bmi    pmnk_zero
  1375.     move.w    #$8000,d2
  1376. @@:
  1377.     ext.l    d2
  1378.     move.l    d2,d0
  1379.     swap    d0
  1380.     move.l    d0,p_pmod_pitch(a5)
  1381.     neg.l    d2
  1382.     divu    d1,d2        *d2=range/L d2.w=step counter
  1383.     move.w    d2,d0
  1384.     clr.w    d2
  1385.     divu    d1,d2        *d2=d2/L
  1386.     swap    d0
  1387.     move.w    d2,d0
  1388.     move.l    d0,p_pmod_step2(a5)
  1389.     add.w    d1,d1
  1390.     subq.w    #1,d1            *96/09/10
  1391.     move.w    d1,p_pmod_spd2(a5)
  1392.     bra    exit_pmnk
  1393. pmnk_pls:
  1394.     add.w    d0,d2            *振幅増減処理
  1395.     bpl    @f
  1396.     tst.w    d0
  1397.     bmi    pmnk_zero
  1398.     move.w    #$7fff,d2
  1399. @@:
  1400.     ext.l    d2
  1401.     move.l    d2,d0
  1402.     swap    d0
  1403.     move.l    d0,p_pmod_pitch(a5)
  1404.     divu    d1,d2        *d2=range/L d2.w=step counter
  1405.     move.w    d2,d0
  1406.     clr.w    d2
  1407.     divu    d1,d2        *d2=d2/L
  1408.     swap    d0
  1409.     move.w    d2,d0
  1410.     addq.l    #1,d0
  1411.     neg.l    d0
  1412.     move.l    d0,p_pmod_step2(a5)
  1413.     add.w    d1,d1
  1414.     subq.w    #1,d1            *96/09/10
  1415.     move.w    d1,p_pmod_spd2(a5)
  1416.     bra    exit_pmnk
  1417. pmnk_zero:                *振幅減少でゼロになった場合
  1418.     moveq.l    #0,d2
  1419.     move.l    d2,p_pmod_step2(a5)
  1420. normal_pmnk:
  1421.     move.l    d2,p_pmod_pitch(a5)
  1422.     add.w    d1,d1
  1423.     subq.w    #1,d1            *96/09/10
  1424.     move.w    d1,p_pmod_spd2(a5)
  1425. exit_pmnk:
  1426.     tst.l    p_pmod_pitch(a5)
  1427.     bne    @f
  1428.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1429.     rts
  1430. @@:
  1431.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1432.     rts
  1433.  
  1434. pmod_kukei:                *矩形波
  1435.     subq.w    #1,p_pmod_spd2(a5)
  1436.     beq    1f
  1437.     cmpi.w    #1,p_pmod_spd2(a5)
  1438.     bne    @f
  1439.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1440.     rts
  1441. @@:
  1442.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1443.     rts
  1444. 1:
  1445.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1446.     move.w    p_pmod_spd(a5),p_pmod_spd2(a5)
  1447.     move.w    p_pmod_step2(a5),d2
  1448.     ext.l    d2
  1449.     bsr    pmod_wvdpn_ope        *振幅増減処理へ
  1450.     neg.l    d2
  1451.     cmpi.l    #-32768,d2
  1452.     bge    @f
  1453.     move.w    #-32768,d2
  1454.     bra    1f
  1455. @@:
  1456.     cmpi.l    #32767,d2
  1457.     ble    1f
  1458.     move.w    #32767,d2
  1459. 1:
  1460.     move.w    d2,p_pmod_step2(a5)
  1461.     move.w    d2,p_pmod_pitch(a5)
  1462.     rts
  1463.  
  1464. pmod_sankaku:                *三角波
  1465.     move.w    p_pmod_spd(a5),d1
  1466.     move.l    p_pmod_pitch(a5),d2
  1467.     bmi    @f
  1468.     add.l    p_pmod_step2(a5),d2
  1469.     bpl    1f
  1470.     tst.b    p_pmod_step2(a5)
  1471.     bmi    1f
  1472.     move.l    #$7fff_ffff,d2
  1473.     bra    1f
  1474. @@:
  1475.     add.l    p_pmod_step2(a5),d2
  1476.     bmi    1f
  1477.     tst.b    p_pmod_step2(a5)
  1478.     bpl    1f
  1479.     move.l    #$8000_0000,d2
  1480. 1:
  1481.     move.l    d2,p_pmod_pitch(a5)
  1482.     subq.w    #1,p_pmod_spd2(a5)
  1483.     bne    @f
  1484.     move.w    d1,p_pmod_spd2(a5)
  1485.     neg.l    p_pmod_step2(a5)
  1486.     bra    exit_pmtr
  1487. @@:                    *中点のときが幅更新
  1488.     lsr.w    #1,d1
  1489.     cmp.w    p_pmod_spd2(a5),d1
  1490.     bne    exit_pmtr
  1491.     addq.w    #1,p_pmod_rndcnt(a5)
  1492.     move.w    p_pmod_rndcnt(a5),d0
  1493.     cmp.w    p_pmod_dpnspd(a5),d0    *指定周期になったか
  1494.     bne    exit_pmtr
  1495.     clr.w    p_pmod_rndcnt(a5)
  1496.     move.w    p_pmod_dpnrpt(a5),d0
  1497.     beq    @f            *無限ループ
  1498.     cmp.w    p_pmod_dpntime(a5),d0
  1499.     beq    exit_pmtr
  1500.     addq.w    #1,p_pmod_dpntime(a5)
  1501. @@:
  1502.     move.w    p_pmod_dpndpt(a5),d2
  1503. *    lsr.w    #1,d1            *上でやっているからREM
  1504.     ext.l    d2
  1505.     bpl    pmtr_pls
  1506.     neg.l    d2
  1507.     divu    d1,d2            *d2=range/L d2.w=step counter
  1508.     move.w    d2,d0
  1509.     clr.w    d2
  1510.     divu    d1,d2        *d2=d2/L
  1511.     swap    d0
  1512.     move.w    d2,d0
  1513.     neg.l    d0        *振幅減衰ケース
  1514.     bra    set_pmtr
  1515. pmtr_pls:
  1516.     divu    d1,d2        *d2=range/L d2.w=step counter
  1517.     move.w    d2,d0
  1518.     clr.w    d2
  1519.     divu    d1,d2        *d2=d2/L
  1520.     swap    d0
  1521.     move.w    d2,d0
  1522.     addq.l    #1,d0
  1523. set_pmtr:
  1524.     move.l    p_pmod_step2(a5),d2
  1525.     bmi    set_pmtr_sub
  1526.     add.l    d0,d2
  1527.     bpl    @f
  1528.     tst.l    d0
  1529.     bmi    pmtr_zero
  1530.     move.l    #$7fff_ffff,d2
  1531. @@:
  1532.     move.l    d2,p_pmod_step2(a5)
  1533.     bra    exit_pmtr
  1534. set_pmtr_sub:
  1535.     sub.l    d0,d2
  1536.     bmi    @f
  1537.     tst.l    d0
  1538.     bmi    pmtr_zero
  1539.     move.l    #$8000_0000,d2
  1540. @@:
  1541.     move.l    d2,p_pmod_step2(a5)
  1542.     bra    exit_pmtr
  1543. pmtr_zero:                *振幅減少でゼロになった場合
  1544.     moveq.l    #0,d2
  1545.     move.l    d2,p_pmod_step2(a5)
  1546. exit_pmtr:
  1547.     tst.l    p_pmod_pitch(a5)
  1548.     bne    @f
  1549.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1550.     rts
  1551. @@:
  1552.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1553.     rts
  1554.  
  1555. pmod_noko2:                *鋸歯波2
  1556.     tst.w    p_pmod_spd2(a5)        *一度0になったらそれまで
  1557.     beq    @f
  1558.     subq.w    #1,p_pmod_spd2(a5)
  1559.     beq    @f
  1560.     move.l    p_pmod_step2(a5),d1
  1561.     add.l    d1,p_pmod_pitch(a5)
  1562.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1563.     rts
  1564. @@:
  1565.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1566.     rts
  1567.  
  1568. pmod_noise:                *ノイズ
  1569.     subq.w    #1,p_pmod_spd2(a5)
  1570.     bne    @f
  1571.     bsr    get_rand
  1572.     move.w    p_pmod_step2(a5),d2
  1573.     bsr    pmod_wvdpn_ope        *振幅増減処理へ
  1574.     muls.w    d2,d0            *noise(-.5~+.5)*depth*2を求める
  1575.     swap    d0
  1576.     add.w    d0,d0
  1577.     move.w    d0,p_pmod_pitch(a5)
  1578.     move.w    p_pmod_spd(a5),d0
  1579.     lsr.w    d0
  1580.     move.w    d0,p_pmod_spd2(a5)
  1581. @@:
  1582.     cmpi.w    #1,p_pmod_spd2(a5)
  1583.     bne    @f
  1584.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  1585.     rts
  1586. @@:
  1587.     bclr.b    #b_pmod_syncok,p_pmod_flg(a5)
  1588.     rts
  1589.  
  1590. arcc_ope:                *AMOD/ARCC処理
  1591.     * X d0-d3,a1
  1592.     * - a3,a4,d5
  1593.     btst.b    #b_arcc_wvsq,p_arcc_flg(a4)    *波形進行音符毎モードか
  1594.     beq    @f
  1595.     cmpi.w    #1,(a5)
  1596.     bne    exit_arcc_ope
  1597.     btst.b    #b_arcc_wvsqrst,p_arcc_flg(a4)
  1598.     bne    @f
  1599.     movea.l    p_data_pointer(a5),a1    *compiled data address
  1600.     cmpi.b    #rest_zmd,(a1)
  1601.     beq    exit_arcc_ope        *休符では更新せず
  1602.     subq.w    #1,p_arcc_syncnt2(a4)
  1603.     bne    exit_arcc_ope
  1604.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  1605. @@:
  1606. vseq_entry:
  1607.     subq.w    #1,p_arcc_dly2(a4)
  1608.     bne    am_chain?
  1609.     moveq.l    #0,d0
  1610.     move.b    p_arcc_n(a4),d0
  1611.     addq.b    #1,d0            *-1.bでエントリのケースもあり(だから.b)
  1612.     cmpi.b    #7,d0
  1613.     bhi    am_chain?        *最後のを継続して使用
  1614.     move.b    d0,p_arcc_n(a4)
  1615.     btst.b    d0,p_arcc_omt(a4)    *省略の場合は前回のものを継続
  1616.     beq    ao0
  1617.     move.b    p_arcc_dpt_tbl(a4,d0.w),d3    *次の波形生成パラメータ
  1618.     move.b    d3,p_arcc_dpt_now(a4)
  1619.     bmi    @f
  1620.     moveq.l    #0,d3
  1621. @@:
  1622.     lsl.w    #8,d3                *256倍する
  1623.     add.w    d0,d0
  1624.     move.w    p_arcc_8st_tbl(a4,d0.w),p_arcc_dly2(a4)
  1625.     move.w    p_arcc_stp_tbl(a4,d0.w),d1    *次の波形生成パラメータ
  1626.     move.w    p_arcc_spd_tbl(a4,d0.w),d2    *次の波形生成パラメータ
  1627.     bne    @f
  1628.     move.w    p_arcc_spd(a4),d2
  1629. @@:
  1630.     tst.b    p_arcc_chain(a4)
  1631.     bne    check_cnct_am
  1632. go_connect_am:                    *波形接続へ
  1633.     move.w    p_arcc_wf(a4),d0        *波形タイプ検査
  1634.     bmi    smt_am_us
  1635.     add.w    d0,d0
  1636.     move.w    smta(pc,d0.w),d0
  1637.     jmp    smta(pc,d0.w)
  1638. smta:    dc.w    smt_swa-smta        *case0:saw
  1639.     dc.w    smt_sqa-smta        *case1:squ
  1640.     dc.w    smt_tra-smta        *case2:tri
  1641.     dc.w    smt_swa2-smta        *case3:sp_saw
  1642.     dc.w    smt_am_ns-smta        *case4:noise
  1643. ao0:
  1644.     add.w    d0,d0
  1645.     move.w    p_arcc_8st_tbl(a4,d0.w),p_arcc_dly2(a4)
  1646.     bra    fmarcc1
  1647. am_chain?:
  1648.     move.b    p_arcc_chain(a4),d0
  1649.     beq    exit_arcc_ope        *「0:即接続」ならばディレイ処理
  1650.     bmi    fmarcc1            *「-1:波形接続処理ずみ」ならば継続
  1651.     move.w    p_arcc_step_next(a4),d1    *次の波形生成パラメータ
  1652.     move.w    p_arcc_spd_next(a4),d2
  1653.     move.w    p_arcc_o_next(a4),d3
  1654.     subq.b    #1,d0            *1 or 2?
  1655.     beq    @f            *case:1
  1656.     tst.b    p_arcc_n(a4)        *case:2(=初回)
  1657.     bmi    exit_arcc_ope        *delay:ケース
  1658.     bra    go_connect_am
  1659.  
  1660. check_cnct_am:                *波形接続チェック
  1661.     move.w    d1,p_arcc_step_next(a4)    *次の波形生成パラメータを
  1662.     move.w    d2,p_arcc_spd_next(a4)    *セットする。
  1663.     move.w    d3,p_arcc_o_next(a4)
  1664.     cmpi.b    #2,p_arcc_chain(a4)    *初回ケース
  1665.     beq    go_connect_am
  1666. @@:
  1667.     move.w    p_arcc_wf(a4),d0
  1668.     bmi    chk_smt_am_us        *波形タイプ検査
  1669.     add.w    d0,d0
  1670.     move.w    smta2(pc,d0.w),d0
  1671.     jmp    smta2(pc,d0.w)
  1672. smta2:    dc.w    chk_smt_swa-smta2    *case0:saw
  1673.     dc.w    chk_smt_sqa-smta2    *case1:squ
  1674.     dc.w    chk_smt_tra-smta2    *case2:tri
  1675.     dc.w    chk_smt_swa2-smta2    *case3:sp_saw
  1676.     dc.w    chk_smt_am_ns-smta2    *case4:noise
  1677.  
  1678. chk_smt_swa:                *ノコギリ波の接続チェック
  1679.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1680.     bpl    am_chain
  1681.     move.w    p_arcc_wf2(a4),d0
  1682.     subq.w    #1,d0            *case:sq
  1683.     beq    @f
  1684.     subq.w    #1,d0            *case:tr
  1685.     beq    1f
  1686.     bra    go_connect_am        *波形接続へ
  1687. @@:                    *sq->sw
  1688.     move.w    p_arcc_level(a4),d0
  1689.     eor.w    d1,d0
  1690.     bpl    go_connect_am        *波形接続へ
  1691.     bra    am_chain
  1692. 1:                    *tr->sw
  1693.     move.w    p_arcc_step2(a4),d0
  1694.     eor.w    d1,d0
  1695.     bmi    go_connect_am        *波形接続へ
  1696.     bra    am_chain
  1697.  
  1698. smt_swa:                *ノコギリ波の接続
  1699.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1700.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1701.     move.w    d3,p_arcc_o(a4)
  1702.     move.w    d3,p_arcc_level(a4)
  1703.     move.w    d2,p_arcc_spd(a4)
  1704.     add.w    d2,d2
  1705.     move.w    d2,p_arcc_spd2(a4)
  1706.     cmpi.b    #2,p_arcc_chain(a4)
  1707.     beq    @f
  1708.     move.w    d1,p_arcc_step2(a4)
  1709.     sne    p_arcc_chain(a4)
  1710.     rts
  1711. @@:                    *初回時のみ特別処理
  1712.     move.w    d1,p_arcc_step2(a4)
  1713.     sne    p_arcc_chain(a4)
  1714.     bra    fmarcc1
  1715.  
  1716. chk_smt_sqa:                *矩形波の接続チェック
  1717.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1718.     bpl    am_chain
  1719.     move.w    p_arcc_wf2(a4),d0
  1720.     subq.w    #1,d0            *case:sq
  1721.     beq    @f
  1722.     subq.w    #1,d0            *case:tr
  1723.     beq    1f
  1724.     bra    go_connect_am        *波形接続へ
  1725. @@:                    *sq->sq
  1726.     move.w    p_arcc_level(a4),d0
  1727.     eor.w    d1,d0
  1728.     bmi    go_connect_am        *波形接続へ
  1729.     bra    am_chain
  1730. 1:                    *tr->sq
  1731.     move.w    p_arcc_step2(a4),d0
  1732.     eor.w    d1,d0
  1733.     bmi    go_connect_am        *波形接続へ
  1734.     bra    am_chain
  1735.  
  1736. smt_sqa:                *矩形波の接続
  1737.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1738.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1739.     move.w    d3,p_arcc_level(a4)
  1740.     move.w    d2,p_arcc_spd(a4)
  1741.     move.w    d2,p_arcc_spd2(a4)
  1742.     cmpi.b    #2,p_arcc_chain(a4)
  1743.     beq    @f
  1744.     move.w    d1,p_arcc_step2(a4)
  1745.     sne    p_arcc_chain(a4)
  1746.     rts
  1747. @@:                    *初回時のみ特別処理
  1748.     move.w    d1,p_arcc_step2(a4)
  1749.     sne    p_arcc_chain(a4)
  1750.     bra    fmarcc1
  1751.  
  1752. chk_smt_tra:                *三角波の接続チェック
  1753.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1754.     bpl    am_chain
  1755.     move.w    p_arcc_wf2(a4),d0
  1756.     subq.w    #1,d0            *case:sq
  1757.     beq    1f
  1758.     subq.w    #1,d0            *case:sq
  1759.     beq    @f
  1760.     bra    go_connect_am
  1761. @@:                    *case:tr->tr
  1762.     move.w    p_arcc_step2(a4),d0
  1763.     eor.w    d1,d0
  1764.     bmi    go_connect_am        *波形接続へ
  1765.     bra    am_chain
  1766. 1:                    *case:sq->tr
  1767.     move.w    p_arcc_level(a4),d0
  1768.     eor.w    d1,d0
  1769.     bpl    go_connect_am        *波形接続へ
  1770.     bra    am_chain
  1771.  
  1772. smt_tra:                *三角波の接続
  1773.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1774.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1775.     move.w    d3,p_arcc_o(a4)
  1776.     move.w    d3,p_arcc_level(a4)
  1777.     move.w    d2,p_arcc_spd(a4)
  1778.     move.w    d2,p_arcc_spd2(a4)
  1779.     cmpi.b    #2,p_arcc_chain(a4)
  1780.     beq    @f
  1781.     move.w    d1,p_arcc_step2(a4)
  1782.     sne    p_arcc_chain(a4)
  1783.     rts
  1784. @@:                    *初回時のみ特別処理
  1785.     move.w    d1,p_arcc_step2(a4)
  1786.     sne    p_arcc_chain(a4)
  1787.     bra    fmarcc1
  1788.  
  1789. chk_smt_swa2:                *ノコギリ波2の接続チェック
  1790.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1791.     bpl    am_chain
  1792.     move.w    p_arcc_wf2(a4),d0
  1793.     subq.w    #1,d0            *case:sq
  1794.     beq    @f
  1795.     subq.w    #1,d0            *case:tr
  1796.     beq    1f
  1797.     bra    go_connect_am        *波形接続へ
  1798. @@:                    *sq->sw
  1799.     move.w    p_arcc_level(a4),d0
  1800.     eor.w    d1,d0
  1801.     bpl    go_connect_am        *波形接続へ
  1802.     bra    am_chain
  1803. 1:                    *tr->sw
  1804.     move.w    p_arcc_step2(a4),d0
  1805.     eor.w    d1,d0
  1806.     bmi    go_connect_am        *波形接続へ
  1807.     bra    am_chain
  1808.  
  1809. smt_swa2:                *ノコギリ波2の接続チェック
  1810.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1811.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1812.     move.w    d3,p_arcc_level(a4)
  1813.     move.w    d2,p_arcc_spd(a4)
  1814.     add.w    d2,d2
  1815.     move.w    d2,p_arcc_spd2(a4)
  1816.     cmpi.b    #2,p_arcc_chain(a4)
  1817.     beq    @f
  1818.     move.w    d1,p_arcc_step2(a4)
  1819.     sne    p_arcc_chain(a4)
  1820.     rts
  1821. @@:                    *初回時のみ特別処理
  1822.     move.w    d1,p_arcc_step2(a4)
  1823.     sne    p_arcc_chain(a4)
  1824.     bra    fmarcc1
  1825.  
  1826. chk_smt_am_ns:
  1827.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok(a4),p_arcc_flg2(a4)
  1828.     bpl    am_chain
  1829.     bra    go_connect_am        *波形接続へ
  1830. smt_am_ns:
  1831.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1832.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1833.     move.w    d2,p_arcc_spd(a4)
  1834.     lsr.w    d2
  1835.     move.w    d2,p_arcc_spd2(a4)
  1836.     move.w    d1,p_arcc_step2(a4)        *ノイズの場合はstep2=振幅
  1837.     sne    p_arcc_chain(a4)
  1838.     bsr    get_rand
  1839.     move.b    p_arcc_step2(a4),d1
  1840.     ext.w    d1
  1841.     bpl    @f
  1842.     neg.w    d1
  1843. @@:
  1844.     mulu    d1,d0
  1845.     swap    d0
  1846.     neg.b    d0
  1847.     move.b    d0,p_arcc_level(a4)
  1848.     rts
  1849.  
  1850. chk_smt_am_us:
  1851.     tst.b    p_arcc_flg2(a4)        *btst.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1852.     bpl    am_chain
  1853.     bra    go_connect_am        *波形接続へ
  1854. smt_am_us:
  1855.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  1856.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  1857.     clr.b    p_alta_flg(a4)        *反復モードスイッチオフ
  1858.     move.w    d2,p_arcc_spd(a4)
  1859.     lsr.w    d2
  1860.     move.w    d2,p_arcc_spd2(a4)
  1861.     move.w    d1,p_arcc_step2(a4)
  1862.     sne    p_arcc_chain(a4)
  1863.     move.l    p_wvam_start(a4),p_wvam_point(a4)
  1864.     move.l    p_wvam_lptm(a4),p_wvam_lptm2(a4)
  1865.     bra    fmarcc1
  1866.  
  1867. am_chain:                    *今回は接続不能,次回に期待。
  1868.     move.b    #1,p_arcc_chain(a4)
  1869. fmarcc1:
  1870. *-------実際のモジュレーション処理-------
  1871.     move.w    p_arcc_wf2(a4),d1
  1872.     bmi    arcc_wvmm
  1873.     add.w    d1,d1
  1874.     move.w    fma1(pc,d1.w),d1
  1875.     jmp    fma1(pc,d1.w)
  1876. fma1:    dc.w    arcc_noko-fma1
  1877.     dc.w    arcc_kukei-fma1
  1878.     dc.w    arcc_sankaku-fma1
  1879.     dc.w    arcc_noko2-fma1
  1880.     dc.w    arcc_noise-fma1
  1881. arcc_wvmm:                *波形メモリ
  1882.     * d6 d7 a4 破壊禁止
  1883.     move.b    p_alta_flg(a4),d0
  1884.     bmi    alternative_ope_a
  1885.     move.l    p_wvam_point(a4),a1
  1886.     move.w    (a1)+,d1
  1887.     ext.l    d1
  1888. arcc_wvmm_patch:            *コンパチモードではパッチ(bra store_arcc_wvmm)
  1889.     move.b    p_arcc_step2(a4),d2
  1890.     ext.w    d2
  1891.     muls.w    d2,d1
  1892.     asr.l    #5,d1            */32
  1893. store_arcc_wvmm:
  1894.     reduce_range_l    d1,-128,127
  1895.     move.b    d1,p_arcc_level(a4)
  1896.     subq.w    #1,p_arcc_spd2(a4)
  1897.     bne    exit_arus
  1898.     move.w    p_arcc_spd(a4),d1
  1899.     lsr.w    #1,d1            *d1=d1/2
  1900.     move.w    d1,p_arcc_spd2(a4)    *init speed work
  1901.     bsr    arcc_wvdpn_ope
  1902.     tst.b    d0
  1903.     bne    @f            *case:+1
  1904.     cmp.l    p_wvam_lped(a4),a1
  1905.     bne    svwvam
  1906.     tst.b    p_wvam_lpmd(a4)        *-1 one shot,0 repeat,+1 alternative
  1907.     bmi    oneshot_am
  1908.     beq    repeat_am
  1909. alternative_am:
  1910.     st.b    p_alta_flg(a4)
  1911. oneshot_am:
  1912.     subq.w    #2,a1
  1913. svwvam:
  1914.     move.l    a1,p_wvam_point(a4)
  1915.     rts
  1916. @@:                    *終了フェーズ
  1917.     cmp.l    p_wvam_end(a4),a1
  1918.     beq    oneshot_am        *もう終わりだ
  1919.     move.l    a1,p_wvam_point(a4)
  1920. exit_arus:
  1921.     rts
  1922. repeat_am:
  1923.     tst.l    p_wvam_lptm2(a4)
  1924.     beq    @f
  1925.     subq.l    #1,p_wvam_lptm2(a4)
  1926.     bne    @f
  1927.     move.b    #1,p_altp_flg(a4)
  1928. @@:
  1929.     move.l    p_wvam_lpst(a4),p_wvam_point(a4)
  1930.     rts
  1931. alternative_ope_a:
  1932.     move.l    p_wvam_point(a4),a1
  1933.     move.w    -(a1),d1
  1934.     move.b    p_arcc_step2(a4),d2
  1935.     ext.w    d2
  1936.     muls.w    d2,d1
  1937.     asr.l    #5,d1
  1938.     move.b    d1,p_arcc_level(a4)
  1939.     subq.w    #1,p_arcc_spd2(a4)
  1940.     bne    exit_arus
  1941.     move.w    p_arcc_spd(a4),d1
  1942.     lsr.w    #1,d1            *d1=d1/2
  1943.     move.w    d1,p_arcc_spd2(a4)    *init speed work
  1944.     bsr    arcc_wvdpn_ope
  1945.     cmp.l    p_wvam_lpst(a4),a1
  1946.     bne    svwvam
  1947.     move.l    p_wvam_lptm2(a4),d0
  1948.     beq    @f
  1949.     subq.l    #1,p_wvam_lptm2(a4)
  1950.     bne    @f
  1951.     moveq.l    #1,d0
  1952. @@:
  1953.     move.b    d0,p_alta_flg(a4)    *d0=0ならば順方向再開,d0=1ならば最終フェーズへ
  1954.     addq.w    #2,a1
  1955.     bra    svwvam
  1956.  
  1957. arcc_wvdpn_ope:                *ARCC振幅増減モード処理
  1958.     addq.w    #1,p_arcc_rndcnt(a4)
  1959.     move.w    p_arcc_rndcnt(a4),d1
  1960.     cmp.w    p_arcc_dpnspd(a4),d1    *指定周期になったか
  1961.     bne    exit_ardpn
  1962.     clr.w    p_arcc_rndcnt(a4)
  1963.     move.w    p_arcc_dpnrpt(a4),d0    *無限ループ
  1964.     beq    @f
  1965.     cmp.w    p_arcc_dpntime(a4),d0
  1966.     beq    exit_ardpn
  1967.     addq.w    #1,p_arcc_dpntime(a4)
  1968. @@:
  1969.     move.b    p_arcc_dpndpt(a4),d1
  1970.     ext.w    d1
  1971.     tst.w    d2
  1972.     bpl    arwvdptpls
  1973.     sub.w    d1,d2            *振幅増減処理
  1974.     bmi    stnewarstp2
  1975.     tst.w    d1
  1976.     bmi    @f
  1977.     moveq    #-128,d2
  1978.     bra    stnewarstp2
  1979. arwvdptpls:
  1980.     add.w    d1,d2            *振幅増減処理
  1981.     bpl    stnewarstp2
  1982.     tst.w    d1
  1983.     bmi    @f
  1984.     moveq.l    #127,d2
  1985.     bra    stnewarstp2
  1986. @@:                    *振幅0へ
  1987.     moveq.l    #0,d2
  1988. stnewarstp2:
  1989.     move.b    d2,p_arcc_step2(a4)
  1990. exit_ardpn:
  1991.     rts
  1992.  
  1993. arcc_noko:                *ノコギリ波
  1994.     subq.w    #1,p_arcc_spd2(a4)
  1995.     beq    2f
  1996.     move.w    p_arcc_step2(a4),d2
  1997.     bpl    1f
  1998.     sub.w    d2,p_arcc_level(a4)
  1999.     ble    @f
  2000.     clr.w    p_arcc_level(a4)
  2001.     bra    @f
  2002. 1:
  2003.     sub.w    d2,p_arcc_level(a4)
  2004.     ble    @f
  2005.     move.w    #$8000,p_arcc_level(a4)
  2006. @@:
  2007.     cmpi.w    #1,p_arcc_spd2(a4)
  2008.     bne    @f
  2009.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2010.     rts
  2011. @@:
  2012.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2013.     rts
  2014. 2:
  2015.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2016.     move.w    p_arcc_spd(a4),d1
  2017.     add.w    d1,d1
  2018.     move.w    d1,p_arcc_spd2(a4)
  2019.     addq.w    #1,p_arcc_rndcnt(a4)
  2020.     move.w    p_arcc_rndcnt(a4),d0
  2021.     cmp.w    p_arcc_dpnspd(a4),d0    *指定周期になったか
  2022.     bne    normal_arnk
  2023.     clr.w    p_arcc_rndcnt(a4)
  2024.     move.w    p_arcc_dpnrpt(a4),d0    *無限ループ
  2025.     beq    @f
  2026.     cmp.w    p_arcc_dpntime(a4),d0
  2027.     beq    normal_arnk
  2028.     addq.w    #1,p_arcc_dpntime(a4)
  2029. @@:
  2030.     move.b    p_arcc_dpndpt(a4),d0
  2031.     ext.w    d0
  2032.     moveq.l    #0,d2
  2033.     move.b    p_arcc_o(a4),d2
  2034.     beq    arnk_pls
  2035.     ext.w    d2
  2036.     sub.w    d0,d2
  2037.     bmi    @f
  2038.     tst.w    d0
  2039.     bmi    arnk_zero
  2040.     move.w    #-128,d2    *わざと.w
  2041. @@:
  2042.     move.w    d2,d0
  2043.     lsl.w    #8,d0
  2044.     move.w    d0,p_arcc_level(a4)
  2045.     move.w    d0,p_arcc_o(a4)
  2046.     neg.w    d2
  2047.     subq.w    #1,d1        *!
  2048.     divu    d1,d2        *d2=range/L d2.w=step counter
  2049.     move.w    d2,d0
  2050.     clr.w    d2
  2051.     divu    d1,d2        *d2=d2/L
  2052.     swap    d0
  2053.     move.w    d2,d0
  2054.     asr.l    #8,d0
  2055.     neg.w    d0
  2056.     move.w    d0,p_arcc_step2(a4)
  2057.     rts
  2058. arnk_pls:
  2059.     sub.b    p_arcc_level(a4),d2
  2060.     add.w    d0,d2            *振幅増減処理
  2061.     bpl    @f
  2062.     tst.w    d0
  2063.     bmi    arnk_zero
  2064.     moveq.l    #127,d2
  2065. @@:
  2066.     clr.w    p_arcc_level(a4)
  2067.     clr.w    p_arcc_o(a4)
  2068.     subq.w    #1,d1            *!
  2069.     divu    d1,d2        *d2=range/L d2.w=step counter
  2070.     move.w    d2,d0
  2071.     clr.w    d2
  2072.     divu    d1,d2        *d2=d2/L
  2073.     swap    d0
  2074.     move.w    d2,d0
  2075.     addq.l    #1,d0
  2076.     asr.l    #8,d0
  2077.     move.w    d0,p_arcc_step2(a4)
  2078.     rts
  2079. normal_arnk:
  2080.     move.w    p_arcc_o(a4),p_arcc_level(a4)
  2081.     rts
  2082. arnk_zero:                *振幅減少でゼロになった場合
  2083.     moveq.l    #0,d2
  2084.     move.l    d2,p_arcc_step2(a4)
  2085.     rts
  2086.  
  2087. arcc_kukei:                *矩形波
  2088.     subq.w    #1,p_arcc_spd2(a4)
  2089.     beq    1f
  2090.     cmpi.w    #1,p_arcc_spd2(a4)
  2091.     bne    @f
  2092.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2093.     rts
  2094. @@:
  2095.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2096.     rts
  2097. 1:
  2098.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2099.     move.w    p_arcc_spd(a4),p_arcc_spd2(a4)
  2100.     move.b    p_arcc_step2(a4),d2
  2101.     ext.w    d2
  2102.     neg.w    d2
  2103.     move.b    d2,p_arcc_step2(a4)
  2104.     bsr    arcc_wvdpn_ope
  2105.     tst.b    p_arcc_level(a4)
  2106.     beq    @f
  2107.     clr.w    p_arcc_level(a4)
  2108.     rts
  2109. @@:
  2110.     tst.b    d2
  2111.     bpl    1f
  2112.     add.b    d2,p_arcc_level(a4)
  2113.     ble    @f
  2114.     move.w    #$8000,p_arcc_level(a4)
  2115. @@:
  2116.     rts
  2117. 1:
  2118.     add.b    d2,p_arcc_level(a4)
  2119.     ble    @f
  2120.     clr.w    p_arcc_level(a4)
  2121. @@:
  2122.     rts
  2123.  
  2124. arcc_sankaku:                *三角波
  2125.     move.w    p_arcc_step2(a4),d1
  2126.     bpl    @f
  2127.     sub.w    d1,p_arcc_level(a4)
  2128.     ble    1f
  2129.     clr.w    p_arcc_level(a4)
  2130.     bra    1f
  2131. @@:
  2132.     sub.w    d1,p_arcc_level(a4)
  2133.     ble    1f
  2134.     move.w    #$8000,p_arcc_level(a4)
  2135. 1:
  2136.     subq.w    #1,p_arcc_spd2(a4)
  2137.     beq    1f
  2138.     cmpi.w    #1,p_arcc_spd2(a4)
  2139.     bne    @f
  2140.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2141.     rts
  2142. @@:
  2143.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2144.     rts
  2145. 1:
  2146.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2147.     neg.w    p_arcc_step2(a4)
  2148.     move.w    p_arcc_spd(a4),d1
  2149.     move.w    d1,p_arcc_spd2(a4)
  2150.     tst.w    p_arcc_level(a4)    *基準点の時のみ振幅更新
  2151.     bne    exit_artr2
  2152.     addq.w    #1,p_arcc_rndcnt(a4)
  2153.     move.w    p_arcc_rndcnt(a4),d0    *指定周期になったか
  2154.     cmp.w    p_arcc_dpnspd(a4),d0    *指定周期になったか
  2155.     bne    exit_artr
  2156.     clr.w    p_arcc_rndcnt(a4)
  2157.     move.w    p_arcc_dpnrpt(a4),d0    *無限ループ
  2158.     beq    @f
  2159.     cmp.w    p_arcc_dpntime(a4),d0
  2160.     beq    exit_artr
  2161.     addq.w    #1,p_arcc_dpntime(a4)
  2162. @@:
  2163.     move.b    p_arcc_dpndpt(a4),d2
  2164.     ext.w    d2
  2165.     bpl    artr_pls
  2166.     neg.w    d2
  2167.     divu    d1,d2        *d2=range/L d2.w=step counter
  2168.     move.w    d2,d0
  2169.     clr.w    d2
  2170.     divu    d1,d2        *d2=d2/L
  2171.     swap    d0
  2172.     move.w    d2,d0
  2173.     neg.l    d0
  2174.     asr.l    #8,d0
  2175.     bra    set_artr
  2176. artr_pls:
  2177.     divu    d1,d2        *d2=range/L d2.w=step counter
  2178.     move.w    d2,d0
  2179.     clr.w    d2
  2180.     divu    d1,d2        *d2=d2/L
  2181.     swap    d0
  2182.     move.w    d2,d0
  2183.     addq.l    #1,d0
  2184.     asr.l    #8,d0
  2185. set_artr:
  2186.     move.w    p_arcc_step2(a4),d2
  2187.     bmi    set_artr_sub
  2188.     add.w    d0,d2
  2189.     bpl    @f
  2190.     tst.w    d0
  2191.     bmi    artr_zero
  2192.     move.w    #$7fff,d2
  2193. @@:
  2194.     move.w    d2,p_arcc_step2(a4)
  2195.     rts
  2196. set_artr_sub:
  2197.     sub.w    d0,d2
  2198.     bmi    @f
  2199.     tst.w    d0
  2200.     bmi    artr_zero
  2201.     move.w    #$8000,d2
  2202. @@:
  2203.     move.w    d2,p_arcc_step2(a4)
  2204.     rts
  2205. artr_zero:                *振幅減少でゼロになった場合
  2206.     moveq.l    #0,d2
  2207.     move.l    d2,p_arcc_step2(a4)
  2208. exit_artr:
  2209.     rts
  2210. exit_artr2:
  2211.     move.w    p_arcc_o(a4),d2
  2212.     beq    @f
  2213.     move.w    d2,p_arcc_level(a4)
  2214. @@:
  2215.     rts
  2216.  
  2217. arcc_noko2:
  2218.     tst.w    p_arcc_spd2(a4)
  2219.     beq    @f
  2220.     subq.w    #1,p_arcc_spd2(a4)
  2221.     beq    @f
  2222.     move.w    p_arcc_step2(a4),d1
  2223.     sub.w    d1,p_arcc_level(a4)
  2224.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2225.     rts
  2226. @@:
  2227.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2228. exit_arcc_ope:
  2229.     rts
  2230.  
  2231. arcc_noise:
  2232.     subq.w    #1,p_arcc_spd2(a4)
  2233.     bne    1f
  2234.     bsr    get_rand
  2235.     move.b    p_arcc_step2(a4),d2
  2236.     ext.w    d2
  2237.     bpl    @f
  2238.     neg.w    d2
  2239. @@:
  2240.     bsr    arcc_wvdpn_ope
  2241.     mulu    d2,d0
  2242.     swap    d0
  2243.     neg.b    d0
  2244.     move.b    d0,p_arcc_level(a4)
  2245.     move.w    p_arcc_spd(a4),d0
  2246.     lsr.w    d0
  2247.     move.w    d0,p_arcc_spd2(a4)
  2248. 1:
  2249.     cmpi.w    #1,p_arcc_spd2(a4)
  2250.     bne    @f
  2251.     tas.b    p_arcc_flg2(a4)        *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2252.     rts
  2253. @@:
  2254.     bclr.b    #b_arcc_syncok,p_arcc_flg2(a4)
  2255.     rts
  2256.  
  2257. reduce_vol    macro    reg
  2258.     * < reg.w=-32768~+32767
  2259.     * > reg.w=0~+127
  2260.     local    rav0
  2261.     local    rav1
  2262.     tst.w    reg
  2263.     bpl    rav0
  2264.     move.w    #0,reg
  2265.     bra    rav1
  2266. rav0:
  2267.     cmpi.w    #127,reg
  2268.     ble    rav1
  2269.     move.w    #127,reg
  2270. rav1:
  2271.     endm
  2272.  
  2273. _case_nof_0    macro            *ノンオフモード時(FM音源,mpcmモード)
  2274.     * < a1.l=k_note
  2275.     * < d6.w=loop counter
  2276.     local    nof0_lp
  2277.     local    next_nof0
  2278. nof0_lp:
  2279.     move.l    (a1)+,d0        *note.b
  2280.     bmi    next_nof0
  2281.     cmpi.w    #MAX_GATE,d0
  2282.     beq    next_nof0
  2283.     addq.w    #1,d0            *check gate time (-1?)TIE_GATE_CODE
  2284.     beq    next_nof0
  2285.     addq.w    #1,d0            *check gate time (-2?)INF_GATE
  2286.     beq    @f            *case:len0
  2287.     subq.w    #1,-2(a1)        *dec gate
  2288.     bne    next_nof0
  2289. @@:
  2290.     ori.w    #$8080,-4(a1)        *gate 0 mark
  2291.     subq.b    #1,d3
  2292. next_nof0:
  2293.     dbra    d6,nof0_lp
  2294.     move.b    d3,p_how_many(a5)
  2295.     endm
  2296.  
  2297. _case_nof_fm:
  2298.     _case_nof_0
  2299.     bra    sp_cmd_ope_fm
  2300.  
  2301. int_play_ope_fm:            *FM
  2302.                     *ゲートタイム処理
  2303.     move.b    p_how_many(a5),d3
  2304.     bmi    sp_cmd_ope_fm        *already all off
  2305.     move.w    p_voice_rsv(a5),d6    *loop counter
  2306.     lea    p_note(a5),a1
  2307.     tst.b    p_track_mode(a5)
  2308.     bmi    _case_nof_fm
  2309.     moveq.l    #8,d1            *FM reg. number
  2310.     move.l    d4,d5
  2311.     move.l    p_opmset(a5),a0        *!
  2312. dg_lp_f:
  2313.     move.l    (a1)+,d0
  2314.     bmi    _next_dgf
  2315.     cmpi.w    #MAX_GATE,d0
  2316.     beq    _next_dgf
  2317.     addq.w    #1,d0            *check gate time (-1?)TIE_GATE_CODE
  2318.     beq    _next_dgf
  2319.     addq.w    #1,d0            *check gate time (-2?)INF_GATE
  2320.     bne    @f
  2321.     ori.w    #$8080,-4(a1)        *case:len0
  2322.     bra    _next_dgf
  2323. @@:
  2324.     subq.w    #1,-2(a1)        *dec gate
  2325.     bne    _next_dgf
  2326.     ori.w    #$8080,-4(a1)        *note.b=off gate=0
  2327.     move.b    opm_kon-work(a6,d5.w),d2
  2328.     and.b    opm_nom-work(a6,d5.w),d2    *FM key off
  2329.     jsr    (a0)            *!opmset
  2330.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  2331.     subq.b    #1,d3
  2332. _next_dgf:
  2333.     addq.b    #1,d5
  2334.     andi.b    #7,d5
  2335.     dbra    d6,dg_lp_f
  2336.     move.b    d3,p_how_many(a5)
  2337. sp_cmd_ope_fm:            *特殊コマンド処理(FMのケース)
  2338.     moveq.l    #0,d5        *d5.lw=pitch mark
  2339.                 *d5.hw=level mark
  2340.                 *各ルーチンはd4は壊さない(壊したら戻す)
  2341.     tst.b    p_port_flg(a5)    *ポルタメントチェック
  2342.     bne    @f
  2343.     tst.b    p_bend_sw(a5)    *オートベンドチェック
  2344.     beq    int_ope2_fm
  2345. @@:                *ディレイ値が正の場合
  2346.     tst.w    p_port_dly(a5)
  2347.     beq    do_port_fm
  2348.     subq.w    #1,p_port_dly(a5)
  2349.     bra    int_ope2_fm
  2350. do_port_fm:
  2351.     tst.w    p_port_cnt(a5)    *ポルタメント継続時間
  2352.     beq    int_ope2_fm
  2353.     port_ope        *ポルタメント/オートベンド処理
  2354.     subq.w    #1,p_port_cnt(a5)
  2355.     moveq.l    #2,d5        *mark
  2356. int_ope2_fm:                *ピッチモジュレーション処理
  2357.     tst.b    p_pmod_sw(a5)
  2358.     beq    int_ope3_fm
  2359.     bsr    pmod_ope
  2360.     ori.w    #4,d5
  2361. int_ope3_fm:            *アフタータッチシーケンス処理
  2362.     swap    d5
  2363.     tst.b    p_aftc_sw(a5)
  2364.     beq    int_ope4_fm
  2365.     subq.w    #1,p_aftc_dly2(a5)
  2366.     bne    iaf0
  2367.     moveq.l    #0,d0
  2368.     move.b    p_aftc_n(a5),d0
  2369.     addq.b    #1,d0            *-1.bでエントリのケースもあり(だから.b)
  2370.     cmpi.b    #7,d0
  2371.     bhi    iaf0
  2372.     move.b    d0,p_aftc_n(a5)
  2373.     btst.b    d0,p_aftc_omt(a5)
  2374.     beq    2f
  2375.     btst.b    d0,p_aftc_rltv(a5)
  2376.     beq    1f
  2377.     move.b    p_aftc_tbl(a5,d0.w),d1
  2378.     bpl    @f
  2379.     add.b    d1,p_aftc_level(a5)
  2380.     bpl    2f
  2381.     clr.b    p_aftc_level(a5)
  2382.     bra    2f
  2383. @@:
  2384.     add.b    d1,p_aftc_level(a5)
  2385.     bpl    2f
  2386.     move.b    #127,p_aftc_level(a5)
  2387.     bra    2f
  2388. 1:
  2389.     move.b    p_aftc_tbl(a5,d0.w),p_aftc_level(a5)
  2390. 2:
  2391.     add.w    d0,d0
  2392.     move.w    p_aftc_8st_tbl(a5,d0.w),p_aftc_dly2(a5)
  2393. iaf0
  2394.     move.w    #2,d5            *mark
  2395. int_ope4_fm:                *AM処理
  2396.     moveq.l    #$80,d6
  2397.     moveq.l    #arcc_max-1,d7
  2398. *    move.l    a5,a4
  2399.     lea    p_arcc_param(a5),a4
  2400. inop4fmlp:
  2401.     tst.b    p_arcc_sw(a4)
  2402.     beq    inop4fm_next
  2403.     bsr    arcc_ope
  2404.     or.b    d6,d5
  2405. inop4fm_next:
  2406.     lea    __arcc_len(a4),a4
  2407.     lsr.b    d6
  2408.     dbra    d7,inop4fmlp
  2409. *    move.l    a4,a5
  2410. int_ope5_fm:
  2411.     move.l    d5,p_lfo_param(a5)    *一時的に保存
  2412.     *↑チャンネルアサインを変更したらこのパラメータも消去する
  2413.     st.b    p_key_on(a5)
  2414.     subq.w    #1,(a5)            *dec p_step_time
  2415.     bne    @f
  2416.     movea.l    p_data_pointer(a5),a0    *compiled data address
  2417.     bsr    run_cmd_fm        *チャンネルアサインが変更されなければ次の番地へ戻ってくる
  2418. fm_return:
  2419.     move.l    a0,p_data_pointer(a5)    *次回に備える
  2420. @@:
  2421.     move.l    p_opmset(a5),a0        *!
  2422.     move.w    p_pitch_param(a5),d5
  2423. *pitch_ope_fm:                *PITCH処理
  2424.     move.w    p_voice_rsv(a5),d7    *loop counter
  2425.     move.w    _pgtjtbl_fm(pc,d5.w),d0
  2426.     jmp    _pgtjtbl_fm(pc,d0.w)
  2427. _pgtjtbl_fm:
  2428.     dc.w    level_ope_fm-_pgtjtbl_fm    *0
  2429.     dc.w    _portonlycase_fm-_pgtjtbl_fm    *2
  2430.     dc.w    _pmodonlycase_fm-_pgtjtbl_fm    *4
  2431.     dc.w    _pmodportcase_fm-_pgtjtbl_fm    *6
  2432.     dc.w    _dtnchg_case_fm-_pgtjtbl_fm    *8
  2433.     dc.w    _portonlycase_fm-_pgtjtbl_fm    *a
  2434.     dc.w    _pmodonlycase_fm-_pgtjtbl_fm    *c
  2435.     dc.w    _pmodportcase_fm-_pgtjtbl_fm    *e
  2436. _dtnchg_case_fm:
  2437. *    moveq.l    #0,d6
  2438. *    bra    @f
  2439. _portonlycase_fm:
  2440.     move.w    p_port_pitch(a5),d6
  2441.     bra    @f
  2442. _pmodonlycase_fm:
  2443. *    move.w    p_pmod_pitch(a5),d6
  2444. *    bra    @f
  2445. _pmodportcase_fm:
  2446.     move.w    p_port_pitch(a5),d6
  2447.     add.w    p_pmod_pitch(a5),d6
  2448. @@:
  2449.     lea    p_note(a5),a4
  2450. pitchfmlp:            *PITCHコントロールONLY
  2451.     move.b    (a4),d0        *get note number
  2452.     move.l    d6,d5        *set pitch param.
  2453.     set_fm_tune        *< a0.l=opmset
  2454.     addq.b    #1,d4
  2455.     andi.b    #7,d4
  2456.     addq.w    #k_note_len,a4
  2457.     dbra    d7,pitchfmlp
  2458. level_ope_fm:            *LEVEL処理
  2459.     move.w    p_level_param(a5),d5        *$0100はポリフォニックプレッシャーケース
  2460.     beq    key_on_fm
  2461.     move.w    p_ch(a5),d4
  2462.     move.w    d5,d0
  2463.     andi.w    #$000f,d0
  2464.     move.w    lvlopjt_fm(pc,d0.w),d0
  2465.     jmp    lvlopjt_fm(pc,d0.w)
  2466. lvlopjt_fm:
  2467.     dc.w    indivi_vol_fm-lvlopjt_fm    *0
  2468.     dc.w    fm_af0-lvlopjt_fm        *2
  2469.     dc.w    set_vol_fm-lvlopjt_fm        *4
  2470.     dc.w    fm_af0-lvlopjt_fm        *6
  2471.  
  2472. key_code_tbl:                *FM音源のキーコードのテーブル
  2473.     *    c   c#  d   d#  e   f   f#  g   g#  a   a#  b
  2474.     dc.b    $0C,$0D,$0E,$00,$01,$02,$04,$05,$06,$08,$09,$0A    *o-1(便宜上)
  2475.     dc.b    $0C,$0D,$0E,$00,$01,$02,$04,$05,$06,$08,$09,$0A    *o0
  2476.     dc.b    $0C,$0D,$0E,$10,$11,$12,$14,$15,$16,$18,$19,$1A    *o1
  2477.     dc.b    $1C,$1D,$1E,$20,$21,$22,$24,$25,$26,$28,$29,$2A    *o2
  2478.     dc.b    $2C,$2D,$2E,$30,$31,$32,$34,$35,$36,$38,$39,$3A    *o3
  2479.     dc.b    $3C,$3D,$3E,$40,$41,$42,$44,$45,$46,$48,$49,$4A    *o4
  2480.     dc.b    $4C,$4D,$4E,$50,$51,$52,$54,$55,$56,$58,$59,$5A    *o5
  2481.     dc.b    $5C,$5D,$5E,$60,$61,$62,$64,$65,$66,$68,$69,$6A    *o6
  2482.     dc.b    $6C,$6D,$6E,$70,$71,$72,$74,$75,$76,$78,$79,$7A    *o7
  2483.     dc.b    $7C,$7D,$7E,$70,$71,$72,$74,$75,$76,$78,$79,$7A    *o8
  2484.     dc.b    $7C,$7D,$7E,$70,$71,$72,$74,$75            *o9(便宜上)
  2485.     .even
  2486.  
  2487. set_vol_fm:                *set volume
  2488.     moveq.l    #127,d0
  2489.     sub.b    p_vol(a5),d0
  2490.     bra    @f
  2491. fm_af0:                    *AFTC
  2492.     moveq.l    #127,d0
  2493.     sub.b    p_aftc_level(a5),d0
  2494. @@:                    *AM処理
  2495.     * < d0.w=volume(127-0)
  2496.     neg.w    d0            *辻褄合わせ
  2497.     lea    p_arcc_param(a5),a4
  2498.     lea    ar_flg(pc),a1
  2499.     moveq.l    #0,d3            *初期値設定
  2500.     move.b    d3,(a1)+        *ar_flg=0
  2501.     move.b    cf-work(a6,d4.w),d3
  2502.     move.l    d3,d1
  2503.     andi.w    #7,d1
  2504.     move.b    fmaf0jtbl(pc,d1.w),d1
  2505.     beq    @f
  2506.     jmp    fmaf0jtbl(pc,d1.w)
  2507. fmaf0jtbl:
  2508.     dc.b    fmaf0_000-fmaf0jtbl
  2509.     dc.b    0
  2510.     dc.b    fmaf0_010-fmaf0jtbl
  2511.     dc.b    0
  2512.     dc.b    0
  2513.     dc.b    0
  2514.     dc.b    fmaf0_110-fmaf0jtbl
  2515.     dc.b    fmaf0_111-fmaf0jtbl
  2516. fmaf0_111:
  2517.     move.w    d0,(a1)+
  2518.     move.w    d0,(a1)+
  2519.     move.w    d0,(a1)+
  2520.     move.w    d0,(a1)+
  2521.     bra    @f
  2522. fmaf0_110:
  2523.     move.l    d0,(a1)+
  2524.     move.w    d0,(a1)+
  2525.     move.w    d0,(a1)+
  2526.     bra    @f
  2527. fmaf0_010:
  2528.     move.l    d0,(a1)+
  2529.     move.l    d0,(a1)+
  2530.     bra    @f
  2531. fmaf0_000:
  2532.     clr.l    (a1)+
  2533.     move.l    d0,(a1)+
  2534. @@:
  2535.     andi.w    #$f0,d5
  2536.     beq    @f
  2537.     bsr    do_calc_fm_arcc        *< d3.l=p_cf
  2538. @@:
  2539.     move.w    p_voice_rsv(a5),d7    *loop counter
  2540.     lea    ar_flg(pc),a1
  2541.     andi.w    #7,d3
  2542.     move.b    invl0jtbl-ar_flg(a1,d3.w),d3
  2543.     lea    invl0jtbl-ar_flg(a1,d3.w),a2    *jsr addr
  2544.     move.b    (a1)+,d3        *a1.l=ar_tl1
  2545.     bne    @f
  2546.     addq.w    #4,a2            *(bsr.w    set_fm_ch_ar)分スキップ
  2547.     bra    fmaflp00
  2548. @@:
  2549.     bsr    do_fm_global_arcc
  2550. fmaflp00:
  2551.     jsr    (a2)
  2552.     addq.b    #1,d4
  2553.     andi.b    #7,d4
  2554.     dbra    d7,fmaflp00
  2555.     bra    key_on_fm
  2556.  
  2557. indivi_vol_fm:                *音量は発音各ノートに依存する
  2558.     andi.w    #$f0,d5            *get arcc mark bit
  2559.     lea    ar_flg(pc),a1
  2560.     moveq.l    #0,d3            *初期値設定
  2561.     move.b    d3,(a1)+        *ar_flg
  2562.     move.l    d3,(a1)+        *tl1-2
  2563.     move.l    d3,(a1)+        *tl3-4
  2564.     move.b    cf-work(a6,d4.w),d3
  2565.     lea    p_arcc_param(a5),a4
  2566.     bsr    do_calc_fm_arcc
  2567.     move.w    p_voice_rsv(a5),d7    *loop counter
  2568.     lea    ar_flg(pc),a1
  2569.     andi.w    #$07,d3
  2570.     move.b    invl1jtbl-ar_flg(a1,d3.w),d3
  2571.     lea    invl1jtbl-ar_flg(a1,d3.w),a2    *jsr addr
  2572.     lea    p_note(a5),a4
  2573.     move.b    (a1)+,d3        *a1.l=ar_tl1
  2574.     bne    @f            *key_on_fm
  2575.     addq.w    #4,a2            *(bsr.w set_fm_ch_ar)の分スキップ
  2576.     bra    ivlp00
  2577. @@:
  2578.     bsr    do_fm_global_arcc
  2579. ivlp00:
  2580.     move.b    k_velo(a4),d0
  2581.     andi.w    #$7f,d0
  2582.     jsr    (a2)
  2583.     addq.w    #1,d4
  2584.     andi.w    #7,d4
  2585.     addq.w    #k_note_len,a4
  2586.     dbra    d7,ivlp00
  2587. key_on_fm:            *ノートオン処理
  2588.     tst.b    p_key_on(a5)    *第1音チェック
  2589.     bmi    exit_kon_fm
  2590. key_on_fm_patch:        *マスク時にパッチ(bra do_fmhlo)
  2591.     tas.b    p_onoff_bit(a5)    *set key on bit
  2592.     lea    p_key_on(a5),a3
  2593. fmkyonlp:
  2594.     move.l    (a3)+,d4    *このワークにどのチャンネルをキーオンすべきか書いてある
  2595.     bmi    do_fmhlo
  2596.     add.w    p_ch(a5),d4
  2597.     andi.w    #7,d4
  2598.     addq.w    #4,a3        *skip
  2599.     move.b    p_om(a5),d2
  2600.     or.b    d4,d2
  2601.     moveq.l    #8,d1
  2602.     jsr    (a0)        *!opmset
  2603.     bra    fmkyonlp
  2604. do_fmhlo:
  2605.     tst.b    p_sync(a5)    *HARD LFOシンクロか
  2606.     beq    exit_kon_fm
  2607.     moveq.l    #1,d1
  2608.     moveq.l    #2,d2        *HARD LFO RESET SEQUENCE #1
  2609.     jsr    (a0)        *!opmset
  2610.     moveq.l    #0,d2        *HARD LFO RESET SEQUENCE #2
  2611.     jmp    (a0)        *!opmset
  2612. exit_kon_fm:
  2613. exit_kon_ad:
  2614.     rts
  2615.  
  2616. ar_pan_:    equ    0
  2617. fmar_wk:
  2618. ar_pan:        dc.w    0            *pan            0
  2619. ar_pms:        dc.w    0            *pms            1
  2620. ar_ams:        dc.w    0            *ams            2
  2621.         dc.w    0            *            3
  2622. ar_amd:        dc.w    0            *amd            4
  2623. ar_pmd:        dc.w    0            *pmd            5
  2624. ar_lsp:        dc.w    0            *lfo spd        6
  2625. ar_nsp:        dc.w    0            *noise spd        7
  2626.  
  2627.         dc.b    0            *!!
  2628. ar_flg:        dc.b    0            *!!flag of ex.arcc
  2629. ar_tl1:        dc.w    0            *!!
  2630. ar_tl2:        dc.w    0            *!!
  2631. ar_tl3:        dc.w    0            *!!
  2632. ar_tl4:        dc.w    0            *!!
  2633. fmar_wk_end:
  2634.  
  2635. invl0jtbl:
  2636.     dc.b    invl0_000-invl0jtbl
  2637.     dc.b    0
  2638.     dc.b    invl0_010-invl0jtbl
  2639.     dc.b    0
  2640.     dc.b    0
  2641.     dc.b    0
  2642.     dc.b    invl0_110-invl0jtbl
  2643.     dc.b    invl0_111-invl0jtbl
  2644.  
  2645. invl0_000:
  2646.     bsr.w    set_fm_ch_ar
  2647.     moveq.l    #$60,d1
  2648.     or.b    d4,d1
  2649.     bsr    set_op1
  2650.     bsr    set_op2
  2651.     bsr    set_op3
  2652.     bra    set_op4_f
  2653.  
  2654. invl0_010:
  2655.     bsr.w    set_fm_ch_ar
  2656.     moveq.l    #$60,d1
  2657.     or.b    d4,d1
  2658.     bsr    set_op1
  2659.     bsr    set_op2_f
  2660.     bsr    set_op3
  2661.     bra    set_op4_f
  2662.  
  2663. invl0_110:
  2664.     bsr.w    set_fm_ch_ar
  2665.     moveq.l    #$60,d1
  2666.     or.b    d4,d1
  2667.     bsr    set_op1
  2668.     bsr    set_op2_f
  2669.     bsr    set_op3_f
  2670.     bra    set_op4_f
  2671.  
  2672. invl0_111:
  2673.     bsr.w    set_fm_ch_ar
  2674.     moveq.l    #$60,d1
  2675.     or.b    d4,d1
  2676.     bsr    set_op1_f
  2677.     bsr    set_op2_f
  2678.     bsr    set_op3_f
  2679.     bra    set_op4_f
  2680.  
  2681. invl1jtbl:
  2682.     dc.b    invl1_000-invl1jtbl
  2683.     dc.b    0
  2684.     dc.b    invl1_010-invl1jtbl
  2685.     dc.b    0
  2686.     dc.b    0
  2687.     dc.b    0
  2688.     dc.b    invl1_110-invl1jtbl
  2689.     dc.b    invl1_111-invl1jtbl
  2690.  
  2691. invl1_000:
  2692.     bsr.w    set_fm_ch_ar
  2693.     moveq.l    #$60,d1
  2694.     or.b    d4,d1
  2695.     bsr    set_op1
  2696.     bsr    set_op2
  2697.     bsr    set_op3
  2698.     bra    set_op4_v
  2699.  
  2700. invl1_010:
  2701.     bsr.w    set_fm_ch_ar
  2702.     moveq.l    #$60,d1
  2703.     or.b    d4,d1
  2704.     bsr    set_op1
  2705.     bsr    set_op2_v
  2706.     bsr    set_op3
  2707.     bra    set_op4_v
  2708.  
  2709. invl1_110:
  2710.     bsr.w    set_fm_ch_ar
  2711.     moveq.l    #$60,d1
  2712.     or.b    d4,d1
  2713.     bsr    set_op1
  2714.     bsr    set_op2_v
  2715.     bsr    set_op3_v
  2716.     bra    set_op4_v
  2717.  
  2718. invl1_111:
  2719.     bsr.w    set_fm_ch_ar
  2720.     moveq.l    #$60,d1
  2721.     or.b    d4,d1
  2722.     bsr    set_op1_v
  2723.     bsr    set_op2_v
  2724.     bsr    set_op3_v
  2725.     bra    set_op4_v
  2726.  
  2727. set_fm_ch_ar:                *FM CH ARCC
  2728.     * < d3=ar_lg
  2729.     * - d0
  2730.     * x d1,d2,d5,a4
  2731.     move.b    d3,d5            *d5=ar_flg
  2732.     beq    exit_sfca
  2733.     lsr.b    #1,d5
  2734.     bcc    @f
  2735.     move.w    ar_pan(pc),d2
  2736.     reduce_range    d2,0,127
  2737.     bsr    conv_p@p
  2738.     ror.b    #2,d2
  2739.     move.b    opmreg+AF(a6,d4.w),d1
  2740.     andi.w    #%0011_1111,d1
  2741.     or.w    d1,d2
  2742.     moveq.l    #$20,d1
  2743.     add.b    d4,d1
  2744.     jsr    (a0)            *!opmset
  2745. @@:                    *PMS (3bits)
  2746.     lsr.b    #1,d5
  2747.     bcc    @f
  2748.     moveq.l    #0,d2
  2749.     move.b    opmreg+$38(a6,d4.w),d1
  2750.     move.w    ar_pms(pc),d2
  2751.     reduce_range    d2,0,7
  2752.     andi.w    #3,d1
  2753.     lsl.b    #4,d2
  2754.     or.b    d1,d2
  2755.     moveq.l    #$38,d1
  2756.     add.b    d4,d1
  2757.     jsr    (a0)            *!opmset
  2758. @@:                    *AMS (2bits)
  2759.     lsr.b    #1,d5
  2760.     bcc    exit_sfca
  2761.     move.b    opmreg+$38(a6,d4.w),d1
  2762.     move.w    ar_ams(pc),d2
  2763.     reduce_range    d2,0,3
  2764.     andi.w    #$70,d1
  2765.     or.b    d1,d2
  2766.     moveq.l    #$38,d1
  2767.     add.b    d4,d1
  2768.     jmp    (a0)            *!opmset
  2769. exit_sfca:
  2770.     rts
  2771.  
  2772. do_calc_fm_arcc:            *複数のARCCによって算出された波形値を加算する
  2773.     * < d3.b=p_cf
  2774.     * < d5.b=arcc enable bits
  2775.     * < a4.l=p_arcc_param(a5)
  2776.     * - d0,d3
  2777.     * X d1,d2,d5,d6,d7,a1,a4
  2778.     moveq.l    #arcc_max-1,d7
  2779.     lea    ar_tl1(pc),a1
  2780. doarcclc1_lp:
  2781.     add.b    d5,d5
  2782.     bcc    next_fm_arcc
  2783.     move.b    p_arcc_level(a4),d6
  2784.     ext.w    d6
  2785. *!    bsr    debug1
  2786.     move.b    p_arcc(a4),d1
  2787.     bmi    extrn_fm_arcc        *FM ARCC(ワウワウ以外のケース)
  2788.     bne    @f
  2789.     move.b    d3,d1            *p_arcc=0のときはp_cfに従う
  2790. @@:
  2791.     andi.w    #$0f,d1
  2792.     beq    next_fm_arcc
  2793.     move.b    dcfajtbl(pc,d1.w),d1
  2794.     jmp    dcfajtbl(pc,d1.w)
  2795. dcfajtbl:
  2796.     dc.b    0            *dummy
  2797.     dc.b    dcfa0001-dcfajtbl
  2798.     dc.b    dcfa0010-dcfajtbl
  2799.     dc.b    dcfa0011-dcfajtbl
  2800.     dc.b    dcfa0100-dcfajtbl
  2801.     dc.b    dcfa0101-dcfajtbl
  2802.     dc.b    dcfa0110-dcfajtbl
  2803.     dc.b    dcfa0111-dcfajtbl
  2804.     dc.b    dcfa1000-dcfajtbl
  2805.     dc.b    dcfa1001-dcfajtbl
  2806.     dc.b    dcfa1010-dcfajtbl
  2807.     dc.b    dcfa1011-dcfajtbl
  2808.     dc.b    dcfa1100-dcfajtbl
  2809.     dc.b    dcfa1101-dcfajtbl
  2810.     dc.b    dcfa1110-dcfajtbl
  2811.     dc.b    dcfa1111-dcfajtbl
  2812. dcfa0001:
  2813.     add.w    d6,ar_tl1-ar_tl1(a1)
  2814.     bra    next_fm_arcc
  2815. dcfa0011:
  2816.     add.w    d6,ar_tl1-ar_tl1(a1)
  2817. dcfa0010:
  2818.     add.w    d6,ar_tl2-ar_tl1(a1)
  2819.     bra    next_fm_arcc
  2820. dcfa0101:
  2821.     add.w    d6,ar_tl1-ar_tl1(a1)
  2822. dcfa0100:
  2823.     add.w    d6,ar_tl3-ar_tl1(a1)
  2824.     bra    next_fm_arcc
  2825. dcfa0111:
  2826.     add.w    d6,ar_tl1-ar_tl1(a1)
  2827. dcfa0110:
  2828.     add.w    d6,ar_tl2-ar_tl1(a1)
  2829.     add.w    d6,ar_tl3-ar_tl1(a1)
  2830.     bra    next_fm_arcc
  2831. dcfa1001:
  2832.     add.w    d6,ar_tl1-ar_tl1(a1)
  2833. dcfa1000:
  2834.     add.w    d6,ar_tl4-ar_tl1(a1)
  2835.     bra    next_fm_arcc
  2836. dcfa1011:
  2837.     add.w    d6,ar_tl1-ar_tl1(a1)
  2838. dcfa1010:
  2839.     add.w    d6,ar_tl2-ar_tl1(a1)
  2840.     add.w    d6,ar_tl4-ar_tl1(a1)
  2841.     bra    next_fm_arcc
  2842. dcfa1101:
  2843.     add.w    d6,ar_tl1-ar_tl1(a1)
  2844. dcfa1100:
  2845.     add.w    d6,ar_tl3-ar_tl1(a1)
  2846.     add.w    d6,ar_tl4-ar_tl1(a1)
  2847.     bra    next_fm_arcc
  2848. dcfa1111:
  2849.     add.w    d6,ar_tl1-ar_tl1(a1)
  2850. dcfa1110:
  2851.     add.w    d6,ar_tl2-ar_tl1(a1)
  2852.     add.w    d6,ar_tl3-ar_tl1(a1)
  2853.     add.w    d6,ar_tl4-ar_tl1(a1)
  2854. next_fm_arcc:
  2855.     lea    __arcc_len(a4),a4
  2856.     dbra    d7,doarcclc1_lp
  2857.     rts
  2858.  
  2859. extrn_fm_arcc:                *その他のケース
  2860.     andi.w    #$7f,d1
  2861.     move.w    d1,d2
  2862.     add.w    d1,d1
  2863.     bset.b    d2,ar_flg-ar_tl1(a1)
  2864.     beq    first_efa
  2865.     bclr.b    #b_arcc_reset,p_arcc_flg(a4)    *初期化要請あったか
  2866.     beq    @f
  2867.     moveq.l    #0,d2
  2868.     move.b    p_arcc_reset(a4),d2        *あった
  2869.     bra    1f
  2870. @@:
  2871.     moveq.l    #0,d2
  2872.     move.b    p_arcc_origin(a4),d2
  2873.     btst.b    #b_arcc_phase,p_arcc_flg2(a4)
  2874.     beq    @f
  2875.     sub.w    d6,d2
  2876.     bra    1f
  2877. @@:
  2878.     add.w    d6,d2
  2879. 1:
  2880.     add.w    d2,fmar_wk-ar_tl1(a1,d1.w)
  2881.     bra    next_fm_arcc
  2882. first_efa:
  2883.     bclr.b    #b_arcc_reset,p_arcc_flg(a4)    *初期化要請あったか
  2884.     beq    @f
  2885.     moveq.l    #0,d2
  2886.     move.b    p_arcc_reset(a4),d2        *あった
  2887.     bra    1f
  2888. @@:
  2889.     moveq.l    #0,d2
  2890.     move.b    p_arcc_origin(a4),d2
  2891.     btst.b    #b_arcc_phase,p_arcc_flg2(a4)
  2892.     beq    @f
  2893.     sub.w    d6,d2
  2894.     bra    1f
  2895. @@:
  2896.     add.w    d6,d2
  2897. 1:
  2898.     move.w    d2,fmar_wk-ar_tl1(a1,d1.w)
  2899.     bra    next_fm_arcc
  2900.  
  2901. do_fm_global_arcc:            *OPM共通レジスタARCC
  2902.     * x d0,d1,d2
  2903.     * - a1
  2904.     move.b    d3,d0            *ar_flg
  2905.     beq    exit_dfga
  2906.                     *noise frq
  2907.     add.b    d0,d0
  2908.     bcc    arcc_lfrq
  2909.     moveq.l    #$0f,d1
  2910.     tst.b    opmreg+$0f(a6)
  2911.     bpl    @f
  2912.     move.w    ar_nsp(pc),d2
  2913.     reduce_range    d2,0,63
  2914.     jsr    (a0)            *!opmset
  2915.     bra    arcc_lfrq
  2916. @@:
  2917.     move.w    ar_nsp(pc),d2
  2918.     reduce_range    d2,0,63
  2919.     tas.b    d2
  2920.     jsr    (a0)            *!opmset
  2921. arcc_lfrq:                *LFO frq
  2922.     add.b    d0,d0
  2923.     bcc    @f
  2924.     moveq.l    #0,d2
  2925.     move.w    ar_lsp(pc),d2
  2926.     add.w    d2,d2
  2927.     reduce_range    d2,0,255
  2928.     moveq.l    #$18,d1
  2929.     jsr    (a0)            *!opmset
  2930. @@:                    *PMD
  2931.     add.b    d0,d0
  2932.     bcc    @f
  2933.     move.w    ar_pmd(pc),d2
  2934.     reduce_range    d2,0,127
  2935.     tas.b    d2
  2936.     moveq.l    #$19,d1
  2937.     jsr    (a0)            *!opmset
  2938. @@:                    *AMD
  2939.     add.b    d0,d0
  2940.     bcc    @f
  2941.     move.w    ar_amd(pc),d2
  2942.     reduce_range    d2,0,127
  2943.     moveq.l    #$19,d1
  2944.     jmp    (a0)            *!opmset
  2945. @@:
  2946. exit_dfga:
  2947.     rts
  2948.  
  2949. set_op1:
  2950.     moveq.l    #0,d2
  2951.     move.b    ol1-work(a6,d4.w),d2    *OP1 carrier
  2952.     sub.w    (a1)+,d2
  2953. reduc_set_op:
  2954.     bmi    @f
  2955.     cmpi.w    #127,d2
  2956.     bls    1f
  2957.     moveq.l    #127,d2
  2958. 1:
  2959.     jmp    (a0)                *!opmset
  2960. @@:
  2961.     moveq.l    #0,d2
  2962.     jmp    (a0)                *!opmset
  2963.  
  2964. set_op2:
  2965.     add.b    #16,d1
  2966.     moveq.l    #0,d2
  2967.     move.b    ol2-work(a6,d4.w),d2        *OP2 carrier
  2968.     sub.w    (a1)+,d2
  2969.     bra    reduc_set_op
  2970.  
  2971. set_op3:
  2972.     subq.b    #8,d1
  2973.     moveq.l    #0,d2
  2974.     move.b    ol3-work(a6,d4.w),d2        *OP3 carrier
  2975.     sub.w    (a1)+,d2
  2976.     bra    reduc_set_op
  2977.  
  2978. *set_op4:
  2979. *    add.b    #16,d1
  2980. *    moveq.l    #0,d2
  2981. *    move.b    ol4-work(a6,d4.w),d2        *OP4 carrier
  2982. *    sub.w    (a1),d2
  2983. *    subq.w    #6,a1                *a1.l=ar_tl1
  2984. *    bra    reduc_set_op
  2985.  
  2986. set_op1_f:
  2987.     move.l    d0,-(sp)
  2988.     moveq.l    #0,d2
  2989.     move.b    ol1-work(a6,d4.w),d2        *OP1 carrier
  2990.     bra    @f
  2991.  
  2992. set_op2_f:
  2993.     move.l    d0,-(sp)
  2994.     add.b    #16,d1
  2995.     moveq.l    #0,d2
  2996.     move.b    ol2-work(a6,d4.w),d2        *OP2 carrier
  2997.     bra    @f
  2998.  
  2999. set_op3_f:
  3000.     move.l    d0,-(sp)
  3001.     subq.b    #8,d1
  3002.     moveq.l    #0,d2
  3003.     move.b    ol3-work(a6,d4.w),d2        *OP3 carrier
  3004. @@:
  3005.     moveq.l    #127,d0
  3006.     add.w    (a1)+,d0
  3007.     reduce_range    d0,0,127
  3008.     bsr    consider_fader_fm
  3009.     add.w    d0,d2
  3010.     move.l    (sp)+,d0
  3011.     bra    reduc_set_op_f
  3012.  
  3013. set_op4_f:
  3014.     move.l    d0,-(sp)
  3015.     add.b    #16,d1
  3016.     moveq.l    #0,d2
  3017.     move.b    ol4-work(a6,d4.w),d2        *OP4 carrier
  3018.     moveq.l    #127,d0
  3019.     add.w    (a1),d0
  3020.     reduce_range    d0,0,127
  3021.     cmpi.w    #7,d4
  3022.     bne    @f
  3023.     tst.b    $0f+opmreg(a6)
  3024.     bpl    @f
  3025.     bsr    consider_fader_fm_n
  3026.     bra    1f
  3027. @@:
  3028.     bsr    consider_fader_fm
  3029. 1:
  3030.     add.w    d0,d2
  3031.     subq.w    #6,a1                *a1.l=ar_tl1
  3032.     move.l    (sp)+,d0
  3033. reduc_set_op_f:
  3034.     tst.w    d2
  3035.     bmi    @f
  3036.     cmpi.w    #127,d2
  3037.     bls    1f
  3038.     moveq.l    #127,d2
  3039. 1:
  3040.     jmp    (a0)                *!opmset
  3041. @@:
  3042.     moveq.l    #0,d2
  3043.     jmp    (a0)                *!opmset
  3044.  
  3045. set_op1_v:
  3046.     * < d0.w=0-127
  3047.     move.l    d0,-(sp)
  3048.     moveq.l    #0,d2
  3049.     move.b    ol1-work(a6,d4.w),d2        *OP1 carrier
  3050.     bra    @f
  3051.  
  3052. set_op2_v:
  3053.     move.l    d0,-(sp)
  3054.     add.b    #16,d1
  3055.     moveq.l    #0,d2
  3056.     move.b    ol2-work(a6,d4.w),d2        *OP2 carrier
  3057.     bra    @f
  3058.  
  3059. set_op3_v:
  3060.     move.l    d0,-(sp)
  3061.     subq.b    #8,d1
  3062.     moveq.l    #0,d2
  3063.     move.b    ol3-work(a6,d4.w),d2        *OP3 carrier
  3064. @@:
  3065.     add.w    (a1)+,d0
  3066.     reduce_range    d0,0,127
  3067.     bsr    consider_fader_fm
  3068.     add.w    d0,d2
  3069.     move.l    (sp)+,d0
  3070.     bra    reduc_set_op_f
  3071.  
  3072. set_op4_v:
  3073.     move.l    d0,-(sp)
  3074.     add.b    #16,d1
  3075.     moveq.l    #0,d2
  3076.     move.b    ol4-work(a6,d4.w),d2        *OP4 carrier
  3077.     add.w    (a1),d0
  3078.     reduce_range    d0,0,127
  3079.     cmpi.w    #7,d4
  3080.     bne    @f
  3081.     tst.b    $0f+opmreg(a6)
  3082.     bpl    @f
  3083.     bsr    consider_fader_fm_n
  3084.     bra    1f
  3085. @@:
  3086.     bsr    consider_fader_fm
  3087. 1:
  3088.     add.w    d0,d2
  3089.     subq.w    #6,a1                *a1.l=ar_tl1
  3090.     move.l    (sp)+,d0
  3091.     bra    reduc_set_op_f
  3092.  
  3093. _case_nof_md:                *ノンオフモード時(MIDI)
  3094.     * < a1.l=p_note
  3095.     * < d3.w=loop counter
  3096. csnf_lp:
  3097.     move.l    (a1)+,d0
  3098.     bmi    end_dgm            *all end
  3099.     cmpi.w    #MAX_GATE,d0
  3100.     beq    next_csnf
  3101.     addq.w    #1,d0            *check gate (-1?)TIE_GATE_CODE
  3102.     beq    next_csnf
  3103.     addq.w    #1,d0            *check gate (-2?)INF_GATE
  3104.     beq    @f            *case len0
  3105.     subq.w    #1,-2(a1)        *dec gate
  3106.     bne    next_csnf
  3107. @@:
  3108.     move.l    d3,d0
  3109.     move.l    a1,a4
  3110. @@:
  3111.     move.l    (a4)+,-8(a4)
  3112.     dbmi    d0,@b
  3113.     subq.l    #k_note_len,a1
  3114. next_csnf:
  3115.     dbra    d3,csnf_lp
  3116.     bra    end_dgm
  3117.  
  3118. int_play_ope_md:            *MIDI
  3119.     move.l    p_midi_trans(a5),a0
  3120.                     *ゲートタイム処理
  3121.     moveq.l    #max_note_on-1,d3
  3122.     lea    p_note(a5),a1
  3123.     tst.b    p_track_mode(a5)
  3124.     bmi    _case_nof_md
  3125. kom_lp0:
  3126.     move.b    (a1)+,d1        *note
  3127.     bmi    end_dgm
  3128.     addq.w    #1,a1
  3129.     move.w    (a1)+,d0
  3130.     cmpi.w    #MAX_GATE,d0
  3131.     beq    next_dgm
  3132.     addq.w    #1,d0            *test gate (-1?)TIE_GATE_CODE
  3133.     beq    next_dgm
  3134.     addq.w    #1,d0            *test gate (-2?)INF_GATE
  3135.     beq    @f            *case:len0
  3136.     subq.w    #1,-2(a1)        *dec gate
  3137.     bne    next_dgm
  3138.     moveq.l    #$90,d0
  3139.     add.b    d4,d0
  3140.     jsr    (a0)            *send cmd
  3141.     move.b    d1,d0
  3142.     jsr    (a0)            *note number
  3143.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  3144.     moveq.l    #$00,d0
  3145.     jsr    (a0)            *#0
  3146. @@:    *ノートワーク整列処理
  3147.     move.l    d3,d0
  3148.     move.l    a1,a4
  3149. @@:
  3150.     move.l    (a4)+,-8(a4)
  3151.     dbmi    d0,@b
  3152.     subq.l    #k_note_len,a1
  3153. next_dgm:
  3154.     dbra    d3,kom_lp0
  3155. end_dgm:
  3156. sp_cmd_ope_md:
  3157.     moveq.l    #0,d5        *d5.lw=pitch mark
  3158.                 *d5.hw=level mark
  3159.                 *各ルーチンはd4は壊さない(壊したら戻す)
  3160.     tst.b    p_port_flg(a5)
  3161.     bne    @f
  3162.     tst.b    p_bend_sw(a5)
  3163.     beq    int_ope2_md
  3164. @@:
  3165.     tst.w    p_port_dly(a5)
  3166.     beq    do_port_md
  3167.     subq.w    #1,p_port_dly(a5)
  3168.     bra    int_ope2_md
  3169. do_port_md:
  3170.     tst.w    p_port_cnt(a5)        *ポルタメント継続時間
  3171.     beq    int_ope2_md
  3172.     port_ope            *ポルタメント/オートベンド処理
  3173.     subq.w    #1,p_port_cnt(a5)
  3174.     moveq.l    #2,d5            *mark
  3175. int_ope2_md:                *ピッチモジュレーション処理
  3176.     tst.b    p_pmod_sw(a5)
  3177.     beq    int_ope3_md
  3178.     tst.b    p_pmod_mode(a5)
  3179.     bmi    normal_pmod_md
  3180.                     *拡張ピッチモジュレーション
  3181.     bsr    pmod_ope
  3182.     ori.w    #4,d5
  3183.     bra    int_ope3_md
  3184. normal_pmod_md:
  3185.     subq.w    #1,p_pmod_dly2(a5)
  3186.     bne    int_ope3_md
  3187.     moveq.l    #0,d2
  3188.     move.b    p_pmod_n(a5),d2
  3189.     addq.b    #1,d2            *-1.bでエントリのケースもあり(だから.b)
  3190.     cmpi.b    #7,d2
  3191.     bhi    int_ope3_md        *最後のを継続して使用
  3192.     move.b    d2,p_pmod_n(a5)
  3193.     btst.b    d2,p_pmod_omt(a5)    *省略の場合は前回のものを継続
  3194.     beq    npm0
  3195.     add.w    d2,d2
  3196.     move.w    p_pmod_8st_tbl(a5,d2.w),p_pmod_dly2(a5)    *set new delay
  3197.     move.w    p_pmod_dpt_tbl(a5,d2.w),d0    *次の振幅パラメータ
  3198.     beq    1f
  3199.     bpl    @f
  3200.     neg.w    d0
  3201. @@:                    *振幅値縮小処理
  3202.     cmpi.w    #127,d0            *(振幅パラメータを尊重するため出力時に行う)
  3203.     bls    1f
  3204.     moveq.l    #127,d0
  3205. 1:
  3206.     move.w    d0,p_pmod_dpt_now(a5)
  3207.     move.w    d0,p_pmod_pitch(a5)    *わざと.w
  3208.     swap    d5            *先取りswap
  3209.     ori.w    #$8000,d5        *mark
  3210.     bra    @f
  3211. npm0:
  3212.     add.w    d2,d2
  3213.     move.w    p_pmod_8st_tbl(a5,d2.w),p_pmod_dly2(a5)    *set new delay
  3214. int_ope3_md:                *アフタータッチシーケンス処理
  3215.     swap    d5
  3216. @@:
  3217.     tst.b    p_aftc_sw(a5)
  3218.     beq    int_ope4_md
  3219.     subq.w    #1,p_aftc_dly2(a5)
  3220.     bne    int_ope4_md
  3221.     moveq.l    #0,d2
  3222.     move.b    p_aftc_n(a5),d2
  3223.     addq.b    #1,d2            *-1.bでエントリのケースもあり(だから.b)
  3224.     cmpi.b    #7,d2
  3225.     bhi    int_ope4_md
  3226.     move.b    d2,p_aftc_n(a5)
  3227.     btst.b    d2,p_aftc_omt(a5)
  3228.     beq    3f
  3229.     btst.b    d2,p_aftc_rltv(a5)
  3230.     beq    1f
  3231.     move.b    p_aftc_tbl(a5,d2.w),d1
  3232.     bpl    @f
  3233.     add.b    d1,p_aftc_level(a5)
  3234.     bpl    2f
  3235.     clr.b    p_aftc_level(a5)
  3236.     bra    2f
  3237. @@:
  3238.     add.b    d1,p_aftc_level(a5)
  3239.     bpl    2f
  3240.     move.b    #127,p_aftc_level(a5)
  3241.     bra    2f
  3242. 1:
  3243.     move.b    p_aftc_tbl(a5,d2.w),p_aftc_level(a5)
  3244. 2:
  3245.     moveq.l    #$d0,d0            *send ch pressure
  3246.     add.b    d4,d0
  3247.     jsr    (a0)            *CH prs
  3248.     move.b    p_aftc_level(a5),d0
  3249.     jsr    (a0)            *aftc value
  3250. 3:
  3251.     add.w    d2,d2
  3252.     move.w    p_aftc_8st_tbl(a5,d2.w),p_aftc_dly2(a5)
  3253. int_ope4_md:                *AM処理
  3254.     moveq.l    #$80,d6            *d6.w=level mark
  3255.     moveq.l    #arcc_max-1,d7
  3256. *    move.l    a5,a4
  3257.     lea    p_arcc_param(a5),a4
  3258. int_ope4_lp:
  3259.     tst.b    p_arcc_sw(a4)
  3260.     beq    int_ope4_next
  3261.     tst.b    p_arcc_mode(a4)
  3262.     bmi    normal_arcc_md
  3263.                     *拡張ARCCモード
  3264.     bsr    arcc_ope
  3265.     or.b    d6,d5            *mark
  3266.     bra    int_ope4_next
  3267. normal_arcc_md:
  3268.     subq.w    #1,p_arcc_dly2(a4)
  3269.     bne    int_ope4_next
  3270.     moveq.l    #0,d2
  3271.     move.b    p_arcc_n(a4),d2
  3272.     addq.b    #1,d2            *-1.bでエントリのケースもあり(だから.b)
  3273.     cmpi.b    #7,d2
  3274.     bhi    int_ope4_next        *最後のを継続して使用
  3275.     move.b    d2,p_arcc_n(a4)
  3276.     btst.b    d2,p_arcc_omt(a4)    *省略の場合は前回のものを継続
  3277.     beq    2f
  3278.     move.b    p_arcc_dpt_tbl(a4,d2.w),d3
  3279.     ext.w    d3
  3280.     bpl    1f
  3281.     neg.w    d3
  3282.     cmpi.w    #127,d3
  3283.     bls    1f
  3284.     moveq.l    #127,d3
  3285. 1:
  3286.     move.b    d3,p_arcc_dpt_now(a4)
  3287.     move.b    d3,p_arcc_level(a4)    *次の振幅パラメータ
  3288.     or.b    d6,d5            *mark
  3289. 2:
  3290.     add.w    d2,d2
  3291.     move.w    p_arcc_8st_tbl(a4,d2.w),p_arcc_dly2(a4)
  3292. int_ope4_next:
  3293.     lea    __arcc_len(a4),a4
  3294.     lsr.b    d6
  3295.     dbra    d7,int_ope4_lp
  3296. *    move.l    a4,a5
  3297. int_ope5_md:
  3298.     move.l    d5,p_lfo_param(a5)    *一時的に保存
  3299.     *↑チャンネルアサインを変更したらこのパラメータも消去する
  3300.     st.b    p_key_on(a5)
  3301.     subq.w    #1,(a5)            *dec p_step_time
  3302.     bne    @f
  3303.     movea.l    p_data_pointer(a5),a0    *compiled data address
  3304.     bsr    run_cmd_md        *チャンネルアサインが変更されなければ次の番地へ戻ってくる
  3305. md_return:
  3306.     move.l    a0,p_data_pointer(a5)    *次回に備える
  3307. @@:
  3308.     move.l    p_midi_trans(a5),a0
  3309.                     * PANPOTの設定
  3310.     bclr.b    #pts_panpot,p_timbre_set(a5)
  3311.     beq    @f
  3312.     moveq.l    #$b0,d0
  3313.     or.b    d4,d0
  3314.     jsr    (a0)            *ctrl chg
  3315.     move.b    p_pan(a5),d1
  3316.     bpl    1f
  3317.     moveq.l    #MIDI_EXP,d0        *PAN=0のシミュレート
  3318.     jsr    (a0)
  3319.     moveq.l    #0,d0            *EXPRESSION=0にする
  3320.     jsr    (a0)
  3321.     bra    @f
  3322. 1:                    *通常パン
  3323.     moveq.l    #MIDI_PAN,d0
  3324.     jsr    (a0)            *pan cmd
  3325.     move.b    d1,d0
  3326.     jsr    (a0)
  3327. @@:                    *音量の設定
  3328.     bclr.b    #pts_volume,p_timbre_set(a5)
  3329.     beq    @f
  3330.     * < d1.b=0-127
  3331.     * < d4.w=ch
  3332.     * X d0-d1,a4
  3333.     moveq.l    #$b0,d0
  3334.     or.b    d4,d0
  3335.     jsr    (a0)
  3336.     moveq.l    #MIDI_VOL,d0
  3337.     jsr    (a0)
  3338.     moveq.l    #0,d0
  3339.     move.b    p_vol(a5),d0
  3340.     bsr    consider_fader_md
  3341.     jsr    (a0)
  3342. @@:
  3343.     bclr.b    #pts_damper,p_timbre_set(a5)
  3344.     beq    @f
  3345.     moveq.l    #$b0,d0
  3346.     or.b    d4,d0
  3347.     jsr    (a0)
  3348.     moveq.l    #MIDI_DMP,d0
  3349.     jsr    (a0)
  3350.     move.b    p_damper(a5),d0
  3351.     jsr    (a0)
  3352. @@:
  3353.     move.l    p_lfo_param(a5),d5
  3354.     beq    key_on_md
  3355.     tst.w    d5
  3356.     beq    chg_pitch?_md
  3357.     move.l    a5,a2        *save a5 into a2
  3358.     lea    p_arcc_param(a5),a5
  3359. arcc_out_lp:
  3360.     add.b    d5,d5
  3361.     bcc    next_arcc_out
  3362.     move.b    p_arcc(a5),d1
  3363.     bmi    next_arcc_out
  3364.     tst.b    p_arcc_mode(a5)
  3365.     bpl    special_arcc
  3366.     moveq.l    #$b0,d0        *NORMAL ARCCの場合
  3367.     or.b    d4,d0
  3368.     jsr    (a0)
  3369.     move.b    d1,d0
  3370.     jsr    (a0)
  3371.     move.b    p_arcc_level(a5),d0
  3372.     bclr.b    #b_arcc_reset,p_arcc_flg(a5)    *初期化要請あったか
  3373.     beq    @f
  3374.     move.b    p_arcc_reset(a5),d0        *あった
  3375. @@:
  3376.     cmpi.b    #MIDI_VOL,d1
  3377.     bne    @f
  3378.     ext.w    d0
  3379.     bsr    consider_fader_md
  3380. @@:
  3381.     jsr    (a0)
  3382.     bra    next_arcc_out
  3383. special_arcc:                    *SPECIAL ARCCの場合
  3384.     * < d1.b=arcc ctrl number
  3385.     bclr.b    #b_arcc_reset,p_arcc_flg(a5)    *初期化要請あったか
  3386.     beq    @f
  3387.     move.b    p_arcc_reset(a5),d2        *あった
  3388.     bra    1f
  3389. @@:
  3390.     move.b    p_arcc_origin(a5),d2
  3391.     btst.b    #b_arcc_phase,p_arcc_flg2(a5)
  3392.     beq    case_normiso
  3393.                         *逆位相ケース
  3394.     move.b    p_arcc_level(a5),d0
  3395. *!    bsr    debug1
  3396.     bpl    @f
  3397.     sub.b    d0,d2
  3398.     bpl    1f
  3399.     moveq.l    #0,d2
  3400.     bra    1f
  3401. @@:
  3402.     sub.b    d0,d2
  3403.     bpl    1f
  3404.     moveq.l    #127,d2
  3405.     bra    1f
  3406. case_normiso:                    *通常位相ケース
  3407.     move.b    p_arcc_level(a5),d0
  3408. *!    bsr    debug1
  3409.     bpl    @f
  3410.     add.b    d0,d2
  3411.     bpl    1f
  3412.     moveq.l    #0,d2
  3413.     bra    1f
  3414. @@:
  3415.     add.b    d0,d2
  3416.     bpl    1f
  3417.     moveq.l    #127,d2
  3418. 1:
  3419.     cmp.b    p_arcc_last(a5),d2
  3420.     beq    next_arcc_out
  3421.     move.b    d2,p_arcc_last(a5)
  3422.     moveq.l    #$b0,d0
  3423.     or.b    d4,d0
  3424.     jsr    (a0)
  3425.     move.b    d1,d0
  3426.     jsr    (a0)
  3427.     move.b    d2,d0
  3428.     cmp.b    #MIDI_VOL,d1
  3429.     bne    @f
  3430.     ext.w    d0
  3431.     bsr    consider_fader_md
  3432. @@:
  3433.     jsr    (a0)
  3434. next_arcc_out:
  3435.     lea    __arcc_len(a5),a5
  3436.     tst.b    d5
  3437.     bne    arcc_out_lp
  3438.     move.l    a2,a5            *get back a5
  3439.                     *normal pmod on ?
  3440.     add.w    d5,d5
  3441.     bcc    1f
  3442.     moveq.l    #$b0,d0
  3443.     or.b    d4,d0
  3444.     jsr    (a0)
  3445.     moveq.l    #MIDI_VIB,d0                *vibrato
  3446.     jsr    (a0)
  3447.     move.w    p_pmod_pitch(a5),d0    *!!
  3448.     beq    @f
  3449.     bset.b    #b_pmod_reset,p_md_flg(a5)        *set @m mark
  3450.     bra    mout@m
  3451. @@:
  3452.     bclr.b    #b_pmod_reset,p_md_flg(a5)        *clr @m mark
  3453. mout@m:
  3454.     jsr    (a0)
  3455. 1:                    *アフタータッチ(初回)の出力
  3456.     add.w    d5,d5
  3457.     bcc    chg_pitch?_md
  3458.     moveq.l    #$d0,d0
  3459.     or.b    d4,d0
  3460.     jsr    (a0)
  3461.     move.b    p_aftc_level(a5),d0
  3462.     jsr    (a0)
  3463. chg_pitch?_md:                *ピッチ系出力
  3464.     swap    d5
  3465.     move.w    pgtjtbl_md(pc,d5.w),d0
  3466.     jmp    pgtjtbl_md(pc,d0.w)
  3467. pgtjtbl_md:
  3468.     dc.w    key_on_md-pgtjtbl_md
  3469.     dc.w    portonlycase_md-pgtjtbl_md
  3470.     dc.w    pmodonlycase_md-pgtjtbl_md
  3471.     dc.w    pmodportcase_md-pgtjtbl_md
  3472.     dc.w    dtnchg_case_md-pgtjtbl_md
  3473.     dc.w    portonlycase_md-pgtjtbl_md
  3474.     dc.w    pmodonlycase_md-pgtjtbl_md
  3475.     dc.w    pmodportcase_md-pgtjtbl_md
  3476. dtnchg_case_md:
  3477. portonlycase_md:
  3478.     move.w    p_port_pitch(a5),d1
  3479.     ext.l    d1
  3480.     bra    chk_sptie
  3481. pmodonlycase_md:
  3482. pmodportcase_md:
  3483.     move.w    p_pmod_pitch(a5),d1    *FM range mode ならば振幅値変換
  3484.     ext.l    d1
  3485.     tst.b    p_pmod_mode(a5)
  3486.     bne    @f
  3487.     chg64_683_    d1        *(64range→683range)
  3488. @@:
  3489.     move.w    p_port_pitch(a5),d0
  3490.     ext.l    d0
  3491.     add.l    d0,d1
  3492. chk_sptie:
  3493.     move.w    p_special_tie(a5),d0
  3494.     ext.l    d0
  3495.     add.l    d0,d1
  3496.     move.w    p_detune(a5),d0
  3497.     ext.l    d0
  3498.     add.l    d0,d1
  3499.     add.l    #8192,d1
  3500.     bpl    @f
  3501.     moveq.l    #0,d1
  3502.     bra    1f
  3503. @@:
  3504.     cmpi.l    #16383,d1
  3505.     bls    1f
  3506.     move.w    #16383,d1
  3507. 1:
  3508.     cmp.w    p_pitch_last(a5),d1
  3509.     beq    key_on_md        *前回と同じ値だった
  3510.     move.w    d1,p_pitch_last(a5)
  3511.     moveq.l    #$e0,d0            *send bend cmd
  3512.     or.b    d4,d0
  3513.     jsr    (a0)
  3514.     move.w    d1,d0
  3515.     andi.b    #127,d0
  3516.     jsr    (a0)
  3517.     bset.b    #b_bend_reset,p_md_flg(a5)        *bend set marker
  3518.     lsr.w    #7,d1
  3519.     move.b    d1,d0
  3520.     jsr    (a0)
  3521. key_on_md:            *ノートオン処理
  3522.     tst.b    p_key_on(a5)
  3523.     bmi    exit_kon_md
  3524.     lea    p_key_on(a5),a3
  3525.     tas.b    p_onoff_bit(a5)    *set key on bit
  3526. konmdlp:
  3527.     move.b    (a3)+,d2
  3528.     bmi    exit_kon_md
  3529.     move.b    (a3)+,d3    *velocity
  3530.     addq.w    #2,a3
  3531.                 *音色設定
  3532.     move.b    (a3)+,d1
  3533.     bmi    @f
  3534.     move.b    d1,p_bank_msb(a5)
  3535.     moveq.l    #$b0,d0
  3536.     or.b    d4,d0
  3537.     jsr    (a0)
  3538.     moveq.l    #$00,d0        *bank MSB
  3539.     jsr    (a0)
  3540.     move.l    d1,d0
  3541.     jsr    (a0)        *BANK送信
  3542. @@:
  3543.     move.b    (a3)+,d1
  3544.     bmi    @f
  3545.     move.b    d1,p_bank_lsb(a5)
  3546.     moveq.l    #$b0,d0
  3547.     or.b    d4,d0
  3548.     jsr    (a0)
  3549.     moveq.l    #$20,d0        *bank LSB
  3550.     jsr    (a0)
  3551.     move.l    d1,d0
  3552.     jsr    (a0)        *BANK送信
  3553. @@:
  3554.     move.w    (a3)+,d1
  3555.     bmi    @f
  3556.     move.w    d1,p_pgm(a5)
  3557.     moveq.l    #$c0,d0
  3558.     or.b    d4,d0
  3559.     jsr    (a0)        *send pgm chg
  3560.     move.l    d1,d0
  3561.     jsr    (a0)
  3562. @@:
  3563. key_on_md_patch:        *マスク時にパッチ(bra konmdlp)
  3564.     moveq.l    #$90,d0        *note on cmd
  3565.     add.b    d4,d0
  3566.     jsr    (a0)
  3567.  
  3568.     move.b    d2,d0        *note number
  3569.     jsr    (a0)
  3570.     move.l    d3,d0        *velocity
  3571.     jsr    (a0)
  3572.     bra    konmdlp
  3573. exit_kon_md:
  3574.     rts
  3575.  
  3576. _case_nof_ad:
  3577.     _case_nof_0
  3578.     bra    sp_cmd_ope_ad
  3579.  
  3580. int_play_ope_ad:            *ADPCM
  3581.                     *ゲートタイム処理
  3582.     move.b    p_how_many(a5),d3
  3583.     bmi    sp_cmd_ope_ad        *already all off
  3584.     move.w    p_voice_rsv(a5),d6    *loop counter
  3585.     lea    p_note(a5),a1
  3586.     tst.b    p_track_mode(a5)
  3587.     bmi    _case_nof_ad
  3588.     moveq.l    #0,d5
  3589.     move.b    d4,d5
  3590. dg_lp_a:
  3591.     move.l    (a1)+,d0
  3592.     bmi    _next_dga
  3593.     cmpi.w    #MAX_GATE,d0
  3594.     beq    _next_dga
  3595.     addq.w    #1,d0            *test gate (-1?)TIE_GATE_CODE
  3596.     beq    _next_dga
  3597.     addq.w    #2,d0            *test gate (-2?)INF_GATE
  3598.     bne    @f
  3599.     ori.w    #$8080,-4(a1)        *case:len0
  3600.     bra    _next_dga
  3601. @@:
  3602.     subq.w    #1,-2(a1)        *dec gate
  3603.     bne    _next_dga
  3604.     ori.w    #$8080,-4(a1)        *case:gate=0 then note.b=off,velo=off
  3605.     move.l    d5,d0
  3606.     bsr    pcm_key_off
  3607.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  3608.     subq.b    #1,d3
  3609. _next_dga:
  3610.     addq.b    #1,d5
  3611.     andi.b    #$0f,d5
  3612.     dbra    d6,dg_lp_a
  3613.     move.b    d3,p_how_many(a5)
  3614. sp_cmd_ope_ad:            *特殊コマンド処理(MPCMのケース)
  3615.     moveq.l    #0,d5        *d5.lw=pitch mark
  3616.                 *d5.hw=level mark
  3617.                 *各ルーチンはd4は壊さない(壊したら戻す)
  3618.     tst.b    p_port_flg(a5)    *ポルタメントチェック
  3619.     bne    @f
  3620.     tst.b    p_bend_sw(a5)    *オートベンドチェック
  3621.     beq    int_ope2_ad
  3622. @@:
  3623.     tst.w    p_port_dly(a5)
  3624.     beq    do_port_ad
  3625.     subq.w    #1,p_port_dly(a5)
  3626.     bra    int_ope2_ad
  3627. do_port_ad:
  3628.     tst.w    p_port_cnt(a5)        *ポルタメント継続時間
  3629.  
  3630. beq    int_ope2_ad
  3631.     port_ope            *ポルタメント/オートベンド処理
  3632.     subq.w    #1,p_port_cnt(a5)
  3633.     moveq.l    #2,d5            *mark
  3634. int_ope2_ad:                *ピッチモジュレーション処理
  3635.     tst.b    p_pmod_sw(a5)
  3636.     beq    int_ope3_ad
  3637.     bsr    pmod_ope
  3638.     ori.w    #4,d5
  3639. int_ope3_ad:                *アフタータッチシーケンス処理
  3640.     swap    d5
  3641.     tst.b    p_aftc_sw(a5)
  3642.     beq    int_ope4_ad
  3643.     subq.w    #1,p_aftc_dly2(a5)
  3644.     bne    iaa0
  3645.     moveq.l    #0,d0
  3646.     move.b    p_aftc_n(a5),d0
  3647.     addq.b    #1,d0            *-1.bでエントリのケースもあり(だから.b)
  3648.     cmpi.b    #7,d0
  3649.     bhi    iaa0
  3650.     move.b    d0,p_aftc_n(a5)
  3651.     btst.b    d0,p_aftc_omt(a5)
  3652.     beq    2f
  3653.     btst.b    d0,p_aftc_rltv(a5)
  3654.     beq    1f
  3655.     move.b    p_aftc_tbl(a5,d0.w),d1
  3656.     bpl    @f
  3657.     add.b    d1,p_aftc_level(a5)
  3658.     bpl    2f
  3659.     clr.b    p_aftc_level(a5)
  3660.     bra    2f
  3661. @@:
  3662.     add.b    d1,p_aftc_level(a5)
  3663.     bpl    2f
  3664.     move.b    #127,p_aftc_level(a5)
  3665.     bra    2f
  3666. 1:
  3667.     move.b    p_aftc_tbl(a5,d0.w),p_aftc_level(a5)
  3668. 2:
  3669.     add.w    d0,d0
  3670.     move.w    p_aftc_8st_tbl(a5,d0.w),p_aftc_dly2(a5)
  3671. iaa0:
  3672.     move.w    #2,d5            *mark
  3673. int_ope4_ad:                *AM処理
  3674.     moveq.l    #$80,d6
  3675.     moveq.l    #arcc_max-1,d7
  3676.     lea    p_arcc_param(a5),a4
  3677. inop4adlp:
  3678.     tst.b    p_arcc_sw(a4)
  3679.     beq    inop4ad_next
  3680.     bsr    arcc_ope
  3681.     or.b    d6,d5
  3682. inop4ad_next:
  3683.     lea    __arcc_len(a4),a4
  3684.     lsr.b    d6
  3685.     dbra    d7,inop4adlp
  3686. int_ope5_ad:
  3687.     move.l    d5,p_lfo_param(a5)    *一時的に保存
  3688.     *↑チャンネルアサインを変更したらこのパラメータも消去する
  3689.     st.b    p_key_on(a5)
  3690.     subq.w    #1,(a5)            *dec p_step_time
  3691.     bne    @f
  3692.     movea.l    p_data_pointer(a5),a0    *compiled data address
  3693.     bsr    run_cmd_ad        *チャンネルアサインが変更されなければ次の番地へ戻ってくる
  3694. ad_return:
  3695.     move.l    a0,p_data_pointer(a5)    *次回に備える
  3696. @@:
  3697.     move.l    p_lfo_param(a5),d5
  3698.     beq    _key_on_ad
  3699.     move.l    d5,d0
  3700.     andi.w    #$000f,d0
  3701.     move.w    lvlopjt_ad(pc,d0.w),d0
  3702.     jmp    lvlopjt_ad(pc,d0.w)
  3703. lvlopjt_ad:
  3704.     dc.w    indivi_vol_ad-lvlopjt_ad    *0
  3705.     dc.w    ad_af0-lvlopjt_ad        *2
  3706.     dc.w    set_vol_ad-lvlopjt_ad        *4
  3707.     dc.w    ad_af0-lvlopjt_ad        *6
  3708. set_vol_ad:                *set volume only
  3709.     moveq.l    #0,d0
  3710.     move.b    p_vol(a5),d0
  3711.     bra    @f
  3712. ad_af0:                    *AFTC
  3713.     moveq.l    #0,d0
  3714.     move.b    p_aftc_level(a5),d0
  3715. @@:
  3716.     * < d0.w=volume(0-127)
  3717.     move.l    d0,ad_ar_flg-work(a6)    *ad_ar_flg=0,ad_ar_vol=d0
  3718.     lea    p_arcc_param(a5),a4
  3719.     andi.w    #$f0,d5
  3720.     beq    @f
  3721.     bsr    do_calc_ad_arcc
  3722. @@:
  3723.     move.w    ad_ar_vol(pc),d0    *get ad_ar_vol
  3724.     bmi    @f
  3725.     cmpi.w    #127,d0
  3726.     bls    go_cfa
  3727.     moveq.l    #127,d0
  3728.     bra    go_cfa
  3729. @@:
  3730.     moveq.l    #0,d0
  3731.     bra    @f
  3732. go_cfa:
  3733.     bsr    consider_fader_ad    *フェーダー考慮
  3734. @@:
  3735.     move.l    d0,d2
  3736.  
  3737.     move.w    p_voice_rsv(a5),d7    *loop counter
  3738.     lea    _set_ad_ch_ar(pc),a2    *フェーダー考慮済み
  3739.     move.w    ad_ar_flg(pc),d3
  3740.     bne    @f
  3741.     lea    do_ad_volume(pc),a2    *フェーダー考慮済み
  3742. @@:                    * < d2.w=volme(0-127)
  3743.     swap    d5
  3744.     tst.w    d5
  3745.     bne    proc_pitch_level_ad
  3746. @@:
  3747.     move.l    d2,d0
  3748.     jsr    (a2)
  3749.     addq.b    #1,d4
  3750.     andi.b    #$0f,d4
  3751.     dbra    d7,@b
  3752.     bra    _key_on_ad
  3753.  
  3754. do_calc_ad_arcc:
  3755.     * < d5.b=arcc enable bits
  3756.     * < a4.l=p_arcc_param(a5)
  3757.     * d1,d2,d3,d5,a4
  3758.     moveq.l    #arcc_max-1,d3
  3759. do_caa_lp:
  3760.     add.b    d5,d5
  3761.     bcc    next_ad_arcc
  3762.     move.b    p_arcc_level(a4),d6
  3763.     ext.w    d6
  3764.     move.b    p_arcc(a4),d1        *arccc ctrl
  3765.     andi.w    #$0f,d1            *V3.00時点でサポートしているのは7(11),10だけ
  3766.     move.b    adar_ctrltbl(pc,d1.w),d1
  3767.     jmp    adar_ctrltbl(pc,d1.w)
  3768. next_ad_arcc:
  3769.     lea    __arcc_len(a4),a4
  3770.     dbra    d3,do_caa_lp
  3771.     rts
  3772.  
  3773. adar_ctrltbl:
  3774.     dc.b    next_ad_arcc-adar_ctrltbl    *0
  3775.     dc.b    next_ad_arcc-adar_ctrltbl    *1
  3776.     dc.b    next_ad_arcc-adar_ctrltbl    *2
  3777.     dc.b    next_ad_arcc-adar_ctrltbl    *3
  3778.     dc.b    next_ad_arcc-adar_ctrltbl    *4
  3779.     dc.b    next_ad_arcc-adar_ctrltbl    *5
  3780.     dc.b    next_ad_arcc-adar_ctrltbl    *6
  3781.     dc.b    calc_adar_vol-adar_ctrltbl    *7 Volume
  3782.     dc.b    next_ad_arcc-adar_ctrltbl    *8
  3783.     dc.b    next_ad_arcc-adar_ctrltbl    *9
  3784.     dc.b    calc_adar_pan-adar_ctrltbl    *10 Panpot
  3785.     dc.b    calc_adar_vol-adar_ctrltbl    *11 Volume
  3786.     dc.b    next_ad_arcc-adar_ctrltbl    *12
  3787.     dc.b    next_ad_arcc-adar_ctrltbl    *13
  3788.     dc.b    next_ad_arcc-adar_ctrltbl    *14
  3789.     dc.b    next_ad_arcc-adar_ctrltbl    *15
  3790.  
  3791. calc_adar_vol:                *ADPCM ARCC VOLの計算
  3792.     tas.b    1+ad_ar_flg-work(a6)    *7
  3793.     add.w    d6,ad_ar_vol-work(a6)
  3794.     bra    next_ad_arcc
  3795.  
  3796. calc_adar_pan:                *ADPCM ARCC PANの計算
  3797.     bset.b    #2,ad_ar_flg-work(a6)    *10
  3798.     beq    first_cap
  3799.     bclr.b    #b_arcc_reset,p_arcc_flg(a4)    *初期化要請あったか
  3800.     beq    @f
  3801.     moveq.l    #0,d1
  3802.     move.b    p_arcc_reset(a4),d1        *あった
  3803.     bra    1f
  3804. @@:
  3805.     moveq.l    #0,d1
  3806.     move.b    p_arcc_origin(a4),d1
  3807.     btst.b    #b_arcc_phase,p_arcc_flg2(a4)
  3808.     beq    @f
  3809.     sub.w    d6,d1
  3810.     bra    1f
  3811. @@:
  3812.     add.w    d6,d1
  3813. 1:
  3814.     add.w    d1,ad_ar_pan-work(a6)
  3815.     bra    next_ad_arcc
  3816. first_cap:
  3817.     bclr.b    #b_arcc_reset,p_arcc_flg(a4)    *初期化要請あったか
  3818.     beq    @f
  3819.     moveq.l    #0,d1
  3820.     move.b    p_arcc_reset(a4),d1        *あった
  3821.     bra    1f
  3822. @@:
  3823.     moveq.l    #0,d1
  3824.     move.b    p_arcc_origin(a4),d1
  3825.     btst.b    #b_arcc_phase,p_arcc_flg2(a4)
  3826.     beq    @f
  3827.     sub.w    d6,d1
  3828.     bra    1f
  3829. @@:
  3830.     add.w    d6,d1
  3831. 1:
  3832.     move.w    d1,ad_ar_pan-work(a6)
  3833.     bra    next_ad_arcc
  3834.  
  3835. ad_ar:
  3836. ad_ar_flg:    ds.w    1    *0-15ビットワーク(今のところ16ビット(0-15))
  3837. ad_ar_vol:    ds.w    1    *0
  3838. ad_ar_pan:    ds.w    1    *2
  3839.  
  3840. set_ad_ch_ar:            *ADPCM共通ARCC
  3841.     * < d0.w=volume(0-127)
  3842.     * < d3.w=ad_ar_flg
  3843.     * < d4=ch
  3844.     * x d0
  3845.     tst.b    d3
  3846.     bpl    @f
  3847.     add.w    ad_ar_vol(pc),d0
  3848.     reduce_range    d0,0,127
  3849. @@:
  3850.     bsr    consider_fader_ad    *フェーダー考慮
  3851. _set_ad_ch_ar:                *フェーダー考慮済みエントリ
  3852.     * < d0.w=volume(0-127)
  3853.     * < d3.w=ad_ar_flg
  3854.     bsr    do_ad_volume
  3855.     * < d3.w=ad_ar_flg
  3856.     * < d4=ch
  3857.     btst.l    #10,d3
  3858.     beq    exit_saca
  3859.     move.w    ad_ar_pan(pc),d2
  3860.     reduce_range    d2,0,127
  3861.     bra    do_adpcm_pan
  3862. exit_saca:
  3863.     rts
  3864.  
  3865. proc_pitch_level_ad:            *PROCESSING PITCH&LEVEL
  3866.     move.w    pgtjtbl_ad(pc,d5.w),d0
  3867.     jmp    pgtjtbl_ad(pc,d0.w)
  3868. pgtjtbl_ad:
  3869.     dc.w    _key_on_ad-pgtjtbl_ad
  3870.     dc.w    portonlycase_ad-pgtjtbl_ad
  3871.     dc.w    pmodonlycase_ad-pgtjtbl_ad
  3872.     dc.w    pmodportcase_ad-pgtjtbl_ad
  3873.     dc.w    dtnchg_case_ad-pgtjtbl_ad
  3874.     dc.w    portonlycase_ad-pgtjtbl_ad
  3875.     dc.w    pmodonlycase_ad-pgtjtbl_ad
  3876.     dc.w    pmodportcase_ad-pgtjtbl_ad
  3877. dtnchg_case_ad:
  3878. *    moveq.l    #0,d5
  3879. *    bra    @f
  3880. portonlycase_ad:
  3881.     move.w    p_port_pitch(a5),d5
  3882.     bra    @f
  3883. pmodonlycase_ad:
  3884. *    move.w    p_pmod_pitch(a5),d5
  3885. *    bra    @f
  3886. pmodportcase_ad:
  3887.     move.w    p_port_pitch(a5),d5
  3888.     add.w    p_pmod_pitch(a5),d5
  3889. @@:
  3890.     * < d2.w=volume 0-127
  3891.     lea    p_note(a5),a4
  3892. @@:
  3893.     move.l    d2,d0
  3894.     jsr    (a2)
  3895.     move.b    (a4),d1            *get note
  3896.     bsr    set_ad_tune
  3897.     addq.b    #1,d4
  3898.     andi.b    #$0f,d4
  3899.     addq.w    #k_note_len,a4
  3900.     dbra    d7,@b
  3901.     bra    key_on_ad
  3902.  
  3903. indivi_vol_ad:                *音量は発音各ノートに依存する
  3904.     move.w    p_voice_rsv(a5),d7    *loop counter
  3905.     andi.w    #$f0,d5            *get arcc mark bit
  3906.     clr.l    ad_ar_flg-work(a6)        *ad_ar_flg=0,ad_ar_vol=0
  3907.     lea    p_arcc_param(a5),a4
  3908.     bsr    do_calc_ad_arcc
  3909.     lea    p_note(a5),a4
  3910.     lea    set_ad_ch_ar(pc),a2        *フェーダー考慮もしなければならない
  3911.     move.w    ad_ar_flg(pc),d3
  3912.     bne    @f
  3913.     lea    _do_ad_volume(pc),a2        *フェーダー考慮もしなければならない
  3914. @@:
  3915.     swap    d5
  3916.     tst.w    d5
  3917.     bne    proc_pitch_level_ad2
  3918. @@:
  3919.     move.b    k_velo(a4),d0
  3920.     andi.w    #$7f,d0
  3921.     jsr    (a2)
  3922.     addq.w    #1,d4
  3923.     andi.w    #$0f,d4
  3924.     addq.w    #k_note_len,a4
  3925.     dbra    d7,@b
  3926. _key_on_ad:                *ノートオン処理
  3927.     moveq.l    #0,d5            *PMOD/PORTパラメータニュートラル値
  3928. key_on_ad:                *PMOD/PORTパラメータを持っている場合はこちらがエントリ
  3929. key_on_ad_patch:            *マスク時にパッチ(RTS)
  3930.     tst.b    p_key_on(a5)        *第1音チェック
  3931.     bmi    exit_kon_ad
  3932.     tas.b    p_onoff_bit(a5)        *set key on bit
  3933.     lea    p_key_on(a5),a3
  3934.     move.w    p_ch(a5),a4        *わざとa4
  3935.     btst.b    #b_vtune_mode,p_md_flg(a5)
  3936.     bne    case_mpcm_k_on        *mpcm key on
  3937. koa_lp:                    *TONE CASE
  3938.     moveq.l    #0,d2
  3939.     move.b    (a3)+,d2        *get note
  3940.     bmi    exit_kon_ad
  3941.     moveq.l    #0,d0
  3942.     move.b    (a3)+,d0        *get velocity
  3943.     bsr    consider_fader_ad
  3944.     move.l    d0,d1
  3945.     move.w    (a3)+,d4
  3946.     move.l    (a3)+,d0        *d0.l=bank,timbre
  3947.     lsl.l    #7,d0            *バンク考慮
  3948.     add.l    d2,d0
  3949.     cmp.w    adpcm_n_max(pc),d0    *データが存在しない
  3950.     bcc    koa_lp
  3951.     lsl.l    #adpcm_tbl_size_,d0    *adpcm_tbl_size倍
  3952.     move.l    adpcm_tbl(pc),a1
  3953.     add.l    d0,a1
  3954.     tst.b    (a1)            *check type
  3955.     beq    koa_lp            *no data
  3956.     add.w    a4,d4
  3957.     andi.w    #$0f,d4
  3958.     lsl.w    #6,d2
  3959.     add.w    d5,d2
  3960.     add.w    p_detune(a5),d2
  3961.     bsr    pcm_key_on        *<a1=data table address,d2=pitch,d1=volume,d4=ch
  3962.     bra    koa_lp
  3963.  
  3964. case_mpcm_k_on:                *MCPMを使用して音量可変発音
  3965.                     *TIMBRE CASE
  3966. koa_lp2:
  3967.     moveq.l    #0,d2
  3968.     move.b    (a3)+,d2
  3969.     bmi    exit_kon_ad
  3970.     moveq.l    #0,d0
  3971.     move.b    (a3)+,d0        *get velocity
  3972.     bsr    consider_fader_ad
  3973.     move.l    d0,d1
  3974.     move.w    (a3)+,d4        *ch offset
  3975.     move.l    (a3)+,d0        *timbre
  3976.     cmp.w    adpcm_n_max2(pc),d0    *データが存在しない
  3977.     bcc    koa_lp2
  3978.     lsl.l    #adpcm_tbl_size_,d0    *adpcm_tbl_size倍
  3979.     move.l    adpcm_tbl2(pc),a1
  3980.     add.l    d0,a1
  3981.     tst.b    (a1)            *check type
  3982. cmko_patch:
  3983.     beq.s    koa_lp2            *非MPCMならばbpl.sになる
  3984.     add.w    a4,d4
  3985.     andi.w    #$0f,d4            *d4=ch
  3986.     lsl.w    #6,d2
  3987.     add.w    d5,d2
  3988.     add.w    p_detune(a5),d2
  3989.     bsr    pcm_key_on        *<a1=data table address,d2=pitch,d1=volume,d4=ch
  3990.     bra    koa_lp2
  3991.  
  3992. proc_pitch_level_ad2:            *PROCESSING PITCH&LEVEL
  3993.     move.w    pgtjtbl_ad2(pc,d5.w),d0
  3994.     jmp    pgtjtbl_ad2(pc,d0.w)
  3995. pgtjtbl_ad2:
  3996.     dc.w    _key_on_ad-pgtjtbl_ad2
  3997.     dc.w    portonlycase_ad2-pgtjtbl_ad2
  3998.     dc.w    pmodonlycase_ad2-pgtjtbl_ad2
  3999.     dc.w    pmodportcase_ad2-pgtjtbl_ad2
  4000.     dc.w    dtnchg_case_ad2-pgtjtbl_ad2
  4001.     dc.w    portonlycase_ad2-pgtjtbl_ad2
  4002.     dc.w    pmodonlycase_ad2-pgtjtbl_ad2
  4003.     dc.w    pmodportcase_ad2-pgtjtbl_ad2
  4004. dtnchg_case_ad2:
  4005. *    moveq.l    #0,d5
  4006. *    bra    @f
  4007. portonlycase_ad2:
  4008.     move.w    p_port_pitch(a5),d5
  4009.     bra    @f
  4010. pmodonlycase_ad2:
  4011. *    move.w    p_pmod_pitch(a5),d5
  4012. *    bra    @f
  4013. pmodportcase_ad2:
  4014.     move.w    p_port_pitch(a5),d5
  4015.     add.w    p_pmod_pitch(a5),d5
  4016. @@:
  4017.     move.b    k_velo(a4),d0
  4018.     andi.w    #$7f,d0
  4019. *    bmi    key_on_ad        *最初だけ効いてる
  4020.     jsr    (a2)
  4021.     move.b    (a4),d1
  4022.     bsr    set_ad_tune
  4023.     addq.w    #1,d4
  4024.     andi.w    #$0f,d4
  4025.     addq.w    #k_note_len,a4
  4026.     dbra    d7,@b
  4027.     bra    key_on_ad
  4028.  
  4029. chg_pitch?_ad:                *PITCH処理?
  4030.     swap    d5
  4031.     move.w    _pgtjtbl_ad(pc,d5.w),d0
  4032.     jmp    _pgtjtbl_ad(pc,d0.w)
  4033. _pgtjtbl_ad:
  4034.     dc.w    _key_on_ad-_pgtjtbl_ad
  4035.     dc.w    _portonlycase_ad-_pgtjtbl_ad
  4036.     dc.w    _pmodonlycase_ad-_pgtjtbl_ad
  4037.     dc.w    _pmodportcase_ad-_pgtjtbl_ad
  4038.     dc.w    _dtnchg_case_ad-_pgtjtbl_ad
  4039.     dc.w    _portonlycase_ad-_pgtjtbl_ad
  4040.     dc.w    _pmodonlycase_ad-_pgtjtbl_ad
  4041.     dc.w    _pmodportcase_ad-_pgtjtbl_ad
  4042. _dtnchg_case_ad:
  4043. *    moveq.l    #0,d5
  4044. *    bra    @f
  4045. _portonlycase_ad:
  4046.     move.w    p_port_pitch(a5),d5
  4047.     bra    @f
  4048. _pmodonlycase_ad:
  4049. *    move.w    p_pmod_pitch(a5),d5
  4050. *    bra    @f
  4051. _pmodportcase_ad:
  4052.     move.w    p_port_pitch(a5),d5
  4053.     add.w    p_pmod_pitch(a5),d5
  4054. @@:
  4055.     lea    p_note(a5),a4
  4056. @@:                    *PITCHコントロールONLY
  4057.     move.b    (a4),d1
  4058.     bsr    set_ad_tune
  4059.     addq.b    #1,d4
  4060.     andi.b    #$0f,d4
  4061.     addq.w    #k_note_len,a4
  4062.     dbra    d7,@b
  4063.     bra    key_on_ad
  4064.  
  4065. run_cmd_fm:                *コマンド解釈(FM)
  4066.     lea    p_key_on(a5),a3
  4067.     clr.b    p_port_flg(a5)
  4068. next_cmd_fm:                *ジャンプする時はd0のビット8~31はall zero
  4069.     move.l    a0,p_now_pointer(a5)
  4070.     moveq.l    #0,d7
  4071.     move.b    (a0)+,d7
  4072.     bpl    case_key_fm        *音階データ
  4073.     add.b    d7,d7            *わざと.bにして最上位ビットを殺す
  4074.     add.w    d7,d7
  4075.     move.l    int_cmd_tbl_fm(pc,d7.w),a1
  4076.     jmp    (a1)
  4077.  
  4078. int_cmd_tbl_fm:                        *コマンド群
  4079.     zmd_j_tbl    fm
  4080.  
  4081. run_cmd_ad:                *コマンド解釈(mpcm.X)
  4082.     lea    p_key_on(a5),a3
  4083.     clr.b    p_port_flg(a5)
  4084. next_cmd_ad:                *ジャンプする時はd0のビット8~31はall zero
  4085.     move.l    a0,p_now_pointer(a5)
  4086.     moveq.l    #0,d7
  4087.     move.b    (a0)+,d7
  4088.     bpl    case_key_ad        *音階データ
  4089.     add.b    d7,d7            *わざと.bにして最上位ビットを殺す
  4090.     add.w    d7,d7
  4091.     move.l    int_cmd_tbl_ad(pc,d7.w),a1
  4092.     jmp    (a1)
  4093.  
  4094. int_cmd_tbl_ad:                        *コマンド群
  4095.     zmd_j_tbl    ad
  4096.  
  4097. run_cmd_md:                *コマンド解釈(MIDI)
  4098.     lea    p_key_on(a5),a3
  4099.     clr.b    p_port_flg(a5)
  4100. next_cmd_md:                *ジャンプする時はd0のビット8~31はall zero
  4101.     move.l    a0,p_now_pointer(a5)
  4102.     moveq.l    #0,d7
  4103.     move.b    (a0)+,d7
  4104.     bpl    case_key_md        *音階データ
  4105.     add.b    d7,d7            *わざと.bにして最上位ビットを殺す
  4106.     add.w    d7,d7
  4107.     move.l    int_cmd_tbl_md(pc,d7.w),a1
  4108.     jmp    (a1)
  4109.  
  4110. int_cmd_tbl_md:                        *コマンド群
  4111.     zmd_j_tbl    md
  4112.  
  4113. dummy_instructios:
  4114. frq_chg_fm:            *FM ADPCM周波数設定
  4115. bend_range_fm:            *FM ベンドレンジ設定
  4116. tie_mode_fm:            *FM TIEモード設定
  4117. pmod_mode_fm:            *FM PMODモード設定
  4118. pcm_mode_fm:
  4119.     addq.w    #1,a0
  4120.     bra    next_cmd_fm
  4121.  
  4122. bend_range_ad:            *ADPCM ベンドレンジ設定
  4123. tie_mode_ad:            *ADPCM TIEモード設定
  4124. pmod_mode_ad:            *ADPCM PMODモード設定
  4125. slot_mask_ad:            *ADPCM スロットマスクの切り換え
  4126.     addq.w    #1,a0
  4127.     bra    next_cmd_ad
  4128.  
  4129. frq_chg_md:            *MIDI ADPCM周波数設定
  4130. slot_mask_md:            *MIDI スロットマスクの切り換え
  4131. pcm_mode_md:
  4132. voice_reserve_md:            *MIDI 発音数予約
  4133.     addq.w    #1,a0
  4134.     bra    next_cmd_md
  4135.  
  4136. arcc_mode_fm:            *FM ARCCモード設定
  4137.     addq.w    #2,a0
  4138.     bra    next_cmd_fm
  4139.  
  4140. arcc_mode_ad:            *ADPCM ARCCモード設定
  4141.     addq.w    #2,a0
  4142.     bra    next_cmd_ad
  4143.  
  4144. NRPN_fm:            *NRPN
  4145.     addq.w    #4,a0
  4146.     bra    next_cmd_fm
  4147.  
  4148. NRPN_ad:            *NRPN
  4149.     addq.w    #4,a0
  4150.     bra    next_cmd_ad
  4151.  
  4152. exclusive_fm:                *Exclusive
  4153.     addq.w    #1,a0            *skip maker ID
  4154. midi_transmission_fm:            *生データ送信
  4155.     moveq.l    #0,d0
  4156.     move.b    (a0)+,d0        *skip comment
  4157.     add.w    d0,a0
  4158.     move.b    (a0)+,-(sp)
  4159.     move.w    (sp)+,d0
  4160.     move.b    (a0)+,d0
  4161.     swap    d0
  4162.     move.b    (a0)+,-(sp)
  4163.     move.w    (sp)+,d0
  4164.     move.b    (a0)+,d0
  4165.     add.l    d0,a0
  4166.     bra    next_cmd_fm
  4167.  
  4168. exclusive_ad:                *Exclusive
  4169.     addq.w    #1,a0            *skip maker ID
  4170. midi_transmission_ad:            *生データ送信
  4171.     moveq.l    #0,d0
  4172.     move.b    (a0)+,d0        *skip comment
  4173.     add.w    d0,a0
  4174.     move.b    (a0)+,-(sp)
  4175.     move.w    (sp)+,d0
  4176.     move.b    (a0)+,d0
  4177.     swap    d0
  4178.     move.b    (a0)+,-(sp)
  4179.     move.w    (sp)+,d0
  4180.     move.b    (a0)+,d0
  4181.     add.l    d0,a0
  4182.     bra    next_cmd_ad
  4183.  
  4184. ID_set_fm:            *ID SET
  4185.     addq.w    #3,a0
  4186.     bra    next_cmd_fm
  4187.  
  4188. rltv_opm_regset_ad:        *相対OPM reg書き込み
  4189. opm_regset_ad:            *OPM reg書き込み
  4190. ID_set_ad:            *ID SET
  4191.     addq.w    #3,a0
  4192.     bra    next_cmd_ad
  4193.  
  4194. rltv_opm_regset_md:        *相対OPM reg書き込み
  4195. opm_regset_md:            *OPM reg書き込み
  4196.     addq.w    #3,a0
  4197.     bra    next_cmd_md
  4198.  
  4199. effect_ctrl_ad:            *ADPCM エフェクトコントロール
  4200.     move.b    (a0)+,d2
  4201.     bsr    skip_by_d2
  4202.     bra    next_cmd_ad
  4203.  
  4204. effect_ctrl_fm:            *FM エフェクトコントロール
  4205.     move.b    (a0)+,d2
  4206.     pea    next_cmd_fm(pc)
  4207.  
  4208. skip_by_d2:
  4209.     * < d2.b=omt.bit
  4210. sbdlp:
  4211.     lsr.b    #1,d2
  4212.     bcc    @f
  4213.     addq.w    #1,a0
  4214. @@:
  4215.     tst.b    d2
  4216.     bne    sbdlp
  4217.     rts
  4218. *------------------------------------------------------------------------------
  4219. play_end_md:
  4220.     lea    p_note(a5),a1        *完全に音が消えたかをチェック
  4221. @@:
  4222.     move.l    (a1)+,d0
  4223.     bmi    1f
  4224.     tst.w    d0
  4225.     ble    @b
  4226. quit_pled:
  4227.     addq.w    #1,(a5)
  4228.     subq.w    #1,a0            *play_endはなかったことにして演奏処理継続
  4229.     rts
  4230. 1:
  4231.     bsr    do_kill_note_md
  4232.     bra    do_play_end
  4233.  
  4234. play_end_ad:
  4235.     move.w    p_how_many(a5),d0
  4236.     bmi    do_play_end
  4237.     lea    p_note(a5),a1        *完全に音が消えたかをチェック
  4238. 1:
  4239.     move.l    (a1)+,d1        *k_noteのd7
  4240.     bmi    @f
  4241.     btst.l    #23,d1            *k_veloのd7
  4242.     bne    @f            *case:gate=0
  4243.     tst.w    d1
  4244.     bgt    quit_pled
  4245. @@:
  4246.     dbra    d0,1b
  4247.     bsr    do_kill_note_ad
  4248.     bra    do_play_end
  4249.  
  4250. play_end_fm:
  4251.     move.w    p_how_many(a5),d0
  4252.     bmi    do_play_end
  4253.     lea    p_note(a5),a1        *完全に音が消えたかをチェック
  4254. 1:
  4255.     move.l    (a1)+,d1        *k_noteのd7
  4256.     bmi    @f
  4257.     btst.l    #23,d1            *k_veloのd7
  4258.     bne    @f            *case:gate=0
  4259.     tst.w    d1
  4260.     bgt    quit_pled
  4261. @@:
  4262.     dbra    d0,1b
  4263.     bsr    do_kill_note_fm
  4264.  
  4265. do_play_end:
  4266.     move.l    jump_flg3(pc),d0    *[jump]中だったか
  4267.     beq    @f
  4268.     bsr    next_jump3_mode_2    *強制的に次フェーズへ
  4269. @@:
  4270.     move.l    jump_flg2(pc),d0    *[@]中だったか
  4271.     beq    @f
  4272.     bsr    next_jump2_mode        *強制的に次フェーズへ
  4273. @@:
  4274.     btst.b    #2,p_seq_flag(a5)    *[!]中だったか
  4275.     beq    1f
  4276.     bsr    end_jump1_mode        *[!]パッチをもとに戻す
  4277. 1:
  4278.     ori.b    #ID_END,p_track_stat(a5)    *end mark
  4279.     btst.b    #_ID_SE,p_track_stat(a5)
  4280.     beq    @f
  4281.     move.l    d4,d0                *効果音モードの演奏終了処理
  4282.     swap    d0
  4283.     tst.w    d0
  4284.     bne    @f
  4285.     bclr.b    d4,mask_opm_ch-work(a6)
  4286.     beq    @f                *マスクされていなかった
  4287.     bsr    restore_opm            *効果音トラック終了時の処理
  4288.     bra    exit_pled
  4289. @@:
  4290.     move.l    obtevtjtbl-work+ed_jump(a6),d1    *全トラック演奏終了ジャンプ?
  4291.     beq    @f
  4292.     tst.w    obtevtjtbl-work+lp_loop(a6)    *ループ回数指定によるジャンプ?
  4293.     beq    chk_all_end1
  4294.     bra    chk_all_end0
  4295. @@:
  4296.     tst.w    obtevtjtbl-work+lp_loop(a6)    *ループ回数指定によるジャンプ?
  4297.     beq    exit_pled
  4298.     addq.w    #1,obtevtjtbl-work+lp_work(a6)    *一応ループ回数に達したとみなす
  4299. exit_pled:
  4300.     rts
  4301.  
  4302. chk_all_end0:
  4303.     addq.w    #1,obtevtjtbl-work+lp_work(a6)    *一応ループ回数に達したとみなす
  4304. chk_all_end1:
  4305.     move.l    play_trk_tbl(pc),a1
  4306.     move.l    seq_wk_tbl(pc),a2
  4307. @@:
  4308.     moveq.l    #0,d0
  4309.     move.w    (a1)+,d0
  4310.     bmi    @f
  4311.     swap    d0
  4312.     lsr.l    #16-trwk_size_,d0
  4313.     tst.b    p_track_stat(a2,d0.w)        *1トラックも演奏していなかったら
  4314.     bne    @b                *all end event発生
  4315.     rts                    *演奏中のトラックが1つでもある
  4316. @@:                        *全トラックが演奏終了した
  4317.     clr.l    obtevtjtbl-work+ed_jump(a6)    *一回機能したら初期化
  4318.     move.l    d1,a1
  4319.     jmp    (a1)
  4320. *------------------------------------------------------------------------------
  4321. do_agogik:
  4322.     lea    tempo_value(pc),a1
  4323.     moveq.l    #0,d2
  4324.     move.w    (a1),d2
  4325.     move.w    p_pmod_pitch(a5),d0
  4326.     moveq.l    #0,d1
  4327.     ext.l    d0
  4328.     bpl    @f
  4329.     move.w    t_min(pc),d1
  4330.     add.l    d0,d2
  4331.     cmp.l    d1,d2
  4332.     bge    2f
  4333.     bra    1f
  4334. @@:
  4335.     move.w    t_max(pc),d1
  4336.     add.l    d0,d2
  4337.     cmp.l    d1,d2
  4338.     ble    2f
  4339. 1:
  4340.     move.w    d1,d2
  4341. 2:
  4342.     cmp.w    p_pitch_last(a5),d2
  4343.     beq    exit_agogik
  4344.     move.w    d2,p_pitch_last(a5)
  4345. agogik_calctm:                *使用タイマによってパッチが当たる
  4346.     bsr.w    do_calc_tmm        *タイマ値計算(< d2.w=tempo)
  4347.     bmi    exit_agogik        * > d1.w=timer m value
  4348.     bsr    wrt_tmp            * < d1.w=timer
  4349. exit_agogik:
  4350.     rts
  4351.  
  4352. do_agogik_se:
  4353.     lea    tempo_value_se(pc),a1
  4354.     moveq.l    #0,d2
  4355.     move.w    (a1),d2
  4356.     move.w    p_pmod_pitch(a5),d0
  4357.     moveq.l    #0,d1
  4358.     ext.l    d0
  4359.     bpl    @f
  4360.     move.w    t_min_se(pc),d1
  4361.     add.l    d0,d2
  4362.     cmp.l    d1,d2
  4363.     bge    2f
  4364.     bra    1f
  4365. @@:
  4366.     move.w    t_max_se(pc),d1
  4367.     add.l    d0,d2
  4368.     cmp.l    d1,d2
  4369.     ble    2f
  4370. 1:
  4371.     move.w    d1,d2
  4372. 2:
  4373.     cmp.w    p_pitch_last(a5),d2
  4374.     beq    exit_agogik_se
  4375.     move.w    d2,p_pitch_last(a5)
  4376. agogik_calctm_se:            *使用タイマによってパッチが当たる
  4377.     bsr.w    do_calc_tmb        *タイマ値計算(< d2.w=tempo)
  4378.     bmi    exit_agogik_se
  4379.     bsr    _wrt_tmp        *実行
  4380. exit_agogik_se:
  4381.     rts
  4382. *------------------------------------------------------------------------------
  4383. tempo_@t_ad:            *ADPCM テンポ(@T指定)
  4384.     bsr    get_tempo_@t
  4385.     bra    next_cmd_ad
  4386.  
  4387. tempo_@t_md:            *MIDI テンポ(@T指定)
  4388.     bsr    get_tempo_@t
  4389.     bra    next_cmd_md
  4390.  
  4391. tempo_@t_fm:            *FM テンポ(@T指定)
  4392.     pea    next_cmd_fm(pc)
  4393.  
  4394. get_tempo_@t:            *@Tコマンドパラメータ取りだし
  4395.     btst.b    #_ID_SE,p_track_stat(a5)
  4396.     bne    _get_tempo_@t
  4397.     lea    timer_value(pc),a1
  4398.     move.b    (a0)+,(a1)+
  4399.     move.b    (a0)+,(a1)+
  4400. tcg0:                *タイマーモードによってパッチが当たる
  4401.     bsr.s    gyakusan_tm_m    * > d1.w=timer
  4402. wrt_tmp:            *タイマーモードによってパッチが当たる
  4403.     bsr.w    set_timer_m    * < d1.w=timer
  4404. _@t_midi_clk:            *-eスイッチがないと'rts'になる    *nmdb!!
  4405.     jmp    midi_clk
  4406.  
  4407. _get_tempo_@t:
  4408.     lea    timer_value_se(pc),a1
  4409.     move.b    (a0)+,(a1)+
  4410.     move.b    (a0)+,(a1)+
  4411. _tcg0:                *タイマーモードによってパッチが当たる
  4412.     bsr.s    gyakusan_tm_b    * > d1.w=timer
  4413. _wrt_tmp:            *タイマーモードによってパッチが当たる
  4414.     bra.w    set_timer_b    * < d1.w=timer
  4415.  
  4416. _gyakusan_tm_b:
  4417.     moveq.l    #0,d1
  4418.     move.w    mst_clk_se(pc),d1
  4419.     bra    @f
  4420. gyakusan_tm_b:
  4421.     * < a1.l=timer_value+2
  4422.     * > d0.w=tempo value
  4423.     * > d1.w=timer value
  4424.     moveq.l    #0,d1
  4425.     move.w    mst_clk(pc),d1
  4426. @@:
  4427.     move.l    #(16*4000*60000)>>8,d0
  4428.     jsr    wari-work(a6)    *d0=d0/d1
  4429.                 *d0=16*4000*60000/(1024*(mst_clk/4))
  4430.     move.w    #256,d2
  4431.     move.w    -(a1),d1    *get timer
  4432.     sub.w    d1,d2
  4433.     lsl.w    #4,d2
  4434.  
  4435.     divu    d2,d0
  4436.     swap    d0
  4437.     tst.w    d0        *余りがあるか
  4438.     beq    @f
  4439.     add.l    #$0001_0000,d0    *余りがあるなら切り上げ
  4440. @@:
  4441.     swap    d0        *d0.w=answer
  4442.     move.w    d0,-(a1)    *set tempo
  4443.     rts
  4444.  
  4445. _gyakusan_tm_a:
  4446.     moveq.l    #0,d1
  4447.     move.w    mst_clk_se(pc),d1
  4448.     bra    @f
  4449. gyakusan_tm_a:
  4450.     * < a1.l=timer_value+2
  4451.     * > d0.w=tempo value
  4452.     * > d1.w=timer value
  4453.     moveq.l    #0,d1
  4454.     move.w    mst_clk(pc),d1
  4455. @@:
  4456.     move.l    #(16*4000*60000)>>8,d0
  4457.     jsr    wari-work(a6)    *d0=d0/d1
  4458.                 *d0=16*4000*60000/(1024*(mst_clk/4))
  4459.     move.w    #1024,d2
  4460.     move.w    -(a1),d1    *get timer
  4461.     sub.w    d1,d2
  4462.     divu    d2,d0
  4463.     move.w    d0,-(a1)    *set tempo
  4464.     rts
  4465.  
  4466. _gyakusan_tm_m:
  4467.     move.w    mst_clk_se(pc),d1
  4468.     bra    @f
  4469. gyakusan_tm_m:
  4470.     * < a1.l=timer_value+2
  4471.     * > d0.w=tempo value
  4472.     * > d1.w=timer value
  4473.     move.w    mst_clk(pc),d1
  4474. @@:
  4475.     move.l    #30*1000*1000,d0
  4476.     move.w    -(a1),d2    *get timer
  4477.     mulu    d2,d1
  4478.     jsr    wari-work(a6)    *d0/d1=d0...d1
  4479.     move.w    d0,-(a1)    *set tempo
  4480.     move.l    d2,d1        *d1.w=timer
  4481.     rts
  4482.  
  4483. rltv_@t_md:            *FM 相対テンポ@T
  4484.     bsr    get_rltv_@t
  4485.     bra    next_cmd_md
  4486.  
  4487. rltv_@t_ad:            *FM 相対テンポ@T
  4488.     bsr    get_rltv_@t
  4489.     bra    next_cmd_ad
  4490.  
  4491. rltv_@t_fm:            *FM 相対テンポ@T
  4492.     pea    next_cmd_fm(pc)
  4493.  
  4494. get_rltv_@t:            *相対テンポ取りだし
  4495.     btst.b    #_ID_SE,p_track_stat(a5)
  4496.     bne    _get_rltv_@t
  4497.     lea    timer_value(pc),a1
  4498.     moveq.l    #0,d1
  4499.     move.w    (a1),d1
  4500.     move.b    (a0)+,d0
  4501.     lsl.w    #8,d0
  4502.     move.b    (a0)+,d0
  4503.     move.w    _@t_max(pc),d2    *$3ff=tm_a, $ff=tm_b, $3fff=tm_m
  4504.     add.w    d0,d1
  4505.     bpl    @f
  4506.     tst.w    d0
  4507.     bmi    r@t_minus_case
  4508. @@:
  4509.     cmp.w    d2,d1        *上限チェック
  4510.     bls    @f
  4511.     move.w    d2,d1        *上限設定
  4512. @@:
  4513.     move.w    d1,(a1)+
  4514.     bra    tcg0
  4515.  
  4516. r@t_minus_case:
  4517.     moveq.l    #0,d1        *最低値設定
  4518.     bra    @b
  4519.  
  4520. _get_rltv_@t:            *相対テンポ取りだし(効果音実行時)
  4521.     lea    timer_value_se(pc),a1
  4522.     moveq.l    #0,d1
  4523.     move.w    (a1),d1
  4524.     move.b    (a0)+,d0
  4525.     lsl.w    #8,d0
  4526.     move.b    (a0)+,d0
  4527.     move.w    _@t_max_se(pc),d2    *$3ff=tm_a, $ff=tm_b, $3fff=tm_m
  4528.     add.w    d0,d1
  4529.     bpl    @f
  4530.     tst.w    d0
  4531.     bmi    _r@t_minus_case
  4532.     cmp.w    d2,d1        *上限チェック
  4533.     bls    @f
  4534.     move.w    d2,d1        *上限設定
  4535. @@:
  4536.     move.w    d1,(a1)+
  4537.     bra    _tcg0
  4538.  
  4539. _r@t_minus_case:
  4540.     moveq.l    #0,d1        *最低値設定
  4541.     bra    @b
  4542. *------------------------------------------------------------------------------
  4543. tempo_t_ad:                *ADPCM テンポ(T指定)
  4544.     bsr    get_tempo_t
  4545.     bra    next_cmd_ad
  4546.  
  4547. tempo_t_md:                *MIDI テンポ(T指定)
  4548.     bsr    get_tempo_t
  4549.     bra    next_cmd_md
  4550.  
  4551. tempo_t_fm:                *FM テンポ(T指定)
  4552.     pea    next_cmd_fm(pc)
  4553.  
  4554. get_tempo_t:                *音楽的テンポ取りだし
  4555.     btst.b    #_ID_SE,p_track_stat(a5)
  4556.     bne    _get_tempo_t
  4557.     lea    tempo_value(pc),a1
  4558.     move.b    (a0)+,d2
  4559.     lsl.w    #8,d2
  4560.     move.b    (a0)+,d2
  4561. smf_tempo:                *SMFのテンポ設定の場合ここに来る
  4562.     * < a1.l=tempo_value
  4563.     * < d2.w=tempo
  4564.     tempo_range    d2
  4565.     move.w    d2,(a1)+
  4566. go_calctm:                *タイマーモードによってパッチが当たる
  4567.     bsr.w    do_calc_tmm        *タイマ値計算(< d2.w=tempo)
  4568.     bmi    @f
  4569.     move.w    d1,(a1)            *設定
  4570.     bra    wrt_tmp            *実行
  4571. @@:
  4572.     rts
  4573.  
  4574. _get_tempo_t:                *音楽的テンポ取りだし(効果音実行時)
  4575.     lea    tempo_value_se(pc),a1
  4576.     move.b    (a0)+,d2
  4577.     lsl.w    #8,d2
  4578.     move.b    (a0)+,d2
  4579.     tempo_range    d2,_se
  4580.     move.w    d2,(a1)+
  4581. _go_calctm:                    *タイマーモードによってパッチが当たる
  4582.     bsr.w    do_calc_tmb            *タイマ値計算(< d2.w=tempo)
  4583.     bmi    @f
  4584.     move.w    d1,(a1)                *設定
  4585.     bra    _wrt_tmp            *実行
  4586. @@:
  4587.     rts
  4588.  
  4589. rltv_t_ad:
  4590.     bsr    get_rltv_t
  4591.     bra    next_cmd_ad
  4592.  
  4593. rltv_t_md:
  4594.     bsr    get_rltv_t
  4595.     bra    next_cmd_md
  4596.  
  4597. rltv_t_fm:
  4598.     pea    next_cmd_fm(pc)
  4599.  
  4600. get_rltv_t:                *相対テンポ取りだし
  4601.     btst.b    #_ID_SE,p_track_stat(a5)
  4602.     bne    _get_rltv_t
  4603.     lea    tempo_value(pc),a1
  4604.     move.w    (a1),d2
  4605.     move.b    (a0)+,d0
  4606.     lsl.w    #8,d0
  4607.     move.b    (a0)+,d0
  4608.     tst.w    d0
  4609.     bpl    @f
  4610.     move.w    t_min(pc),d1        *最低値
  4611.     add.w    d0,d2
  4612.     cmp.w    d1,d2
  4613.     bcc    2f
  4614.     bra    1f
  4615. @@:
  4616.     move.w    t_max(pc),d1        *最大値
  4617.     add.w    d0,d2
  4618.     cmp.w    d1,d2
  4619.     bls    2f
  4620. 1:
  4621.     move.w    d1,d2
  4622. 2:
  4623.     move.w    d2,(a1)+
  4624.     bra    go_calctm
  4625.  
  4626. _get_rltv_t:                *相対テンポ取りだし(効果音実行時)
  4627.     lea    tempo_value_se(pc),a1
  4628.     move.w    (a1),d2
  4629.     move.b    (a0)+,d0
  4630.     lsl.w    #8,d0
  4631.     move.b    (a0)+,d0
  4632.     tst.w    d0
  4633.     bpl    @f
  4634.     move.w    t_min_se(pc),d2        *最低値
  4635.     add.w    d0,d2
  4636.     cmp.w    d1,d2
  4637.     bcc    2f
  4638.     bra    1f
  4639. @@:
  4640.     move.w    t_max_se(pc),d1        *最大値
  4641.     add.w    d0,d2
  4642.     cmp.w    d1,d2
  4643.     bls    2f
  4644. 1:
  4645.     move.w    d1,d2
  4646. 2:
  4647.     move.w    d2,(a1)+
  4648.     bra    _go_calctm
  4649. *------------------------------------------------------------------------------
  4650. set_timer_b:            *タイマーBの初期化(init_timer_bとほぼ同じ)
  4651.     * < d1.w=timer value
  4652.     move.l    d1,d2        *get timer value
  4653.     moveq.l    #$12,d1
  4654. *    move.l    p_opmset(a5),a4    *!
  4655. *    jmp    (a4)        *!opmset
  4656.     bra    opmset
  4657.  
  4658. set_timer_a:            *タイマーAの初期化(init_timer_aとほぼ同じ)
  4659.     * < d1.w=timer value
  4660.     move.l    d1,d2
  4661.     moveq.l    #$11,d1
  4662. *    move.l    p_opmset(a5),a4    *!
  4663. *    jsr    (a4)        *!opmset(set value L)
  4664.     bsr    opmset
  4665.     lsr.w    #2,d2
  4666.     moveq.l    #$10,d1
  4667. *    jmp    (a4)        *!opmset(set value H)
  4668.     bra    opmset
  4669.  
  4670. set_timer_m:            *MIDIタイマーの初期化(init_timer_mとほぼ同じ)
  4671.     * < d1.w=timer value
  4672.     ori.w    #$8000,d1
  4673.     move.w    sr,-(sp)
  4674.     ori.w    #$0700,sr
  4675.     lea    rgr,a4
  4676.     move.b    #$8,(a4)    *rgr
  4677.     midiwait
  4678.     move.b    d1,grp4-rgr(a4)
  4679.     midiwait
  4680.     ror.w    #8,d1
  4681.     move.b    d1,grp5-rgr(a4)
  4682.     midiwait
  4683.     move.w    (sp)+,sr
  4684.     rts
  4685. *------------------------------------------------------------------------------
  4686. opm_regset_fm:
  4687.     move.l    p_opmset(a5),a4
  4688.     move.b    (a0)+,d1        *reg ID
  4689.     bmi    not_op_reg
  4690.     move.b    d1,d0
  4691.     andi.w    #$f0,d1
  4692.     lsr.b    #1,d1
  4693.     add.b    d4,d1
  4694.     andi.w    #$0f,d0
  4695.     add.w    d0,d0
  4696.     move.w    opmregope(pc,d0.w),d0
  4697.     jmp    opmregope(pc,d0.w)
  4698. opmregope:
  4699.     dc.w    regope_MUL-opmregope        *0
  4700.     dc.w    regope_DT1-opmregope        *1
  4701.     dc.w    regope_TL-opmregope        *2
  4702.     dc.w    regope_AR-opmregope        *3
  4703.     dc.w    regope_KS-opmregope        *4
  4704.     dc.w    regope_1DR-opmregope        *5
  4705.     dc.w    regope_AMS_EN-opmregope        *6
  4706.     dc.w    regope_2DR-opmregope        *7
  4707.     dc.w    regope_DT2-opmregope        *8
  4708.     dc.w    regope_RR-opmregope        *9
  4709.     dc.w    regope_1DL-opmregope        *10
  4710.  
  4711. regope_MUL:
  4712.     add.b    #$40,d1
  4713.     move.b    opmreg(a6,d1.w),d2
  4714.     andi.w    #$f0,d2
  4715.     or.b    (a0)+,d2
  4716.     jsr    (a4)            *opmset
  4717.     bra    next_cmd_fm
  4718.  
  4719. regope_DT1:
  4720.     add.b    #$40,d1
  4721.     move.b    opmreg(a6,d1.w),d2
  4722.     andi.w    #$0f,d2
  4723.     move.b    (a0)+,d0
  4724.     lsl.b    #4,d0
  4725.     or.b    d0,d2
  4726.     jsr    (a4)            *opmset
  4727.     bra    next_cmd_fm
  4728.  
  4729. regope_TL:
  4730.     add.b    #$60,d1
  4731.     move.b    (a0)+,d2
  4732.     jsr    (a4)            *opmset
  4733.     pea    next_cmd_fm(pc)
  4734. set_to_olwk:
  4735.     * < d1=$60-$7f
  4736.     * < d2=0-127
  4737. *    sub.b    #$60,d1            *$00-$1f
  4738. *    move.b    @f(pc,d1.w),d1
  4739. *    move.b    d2,ol1-work(a6,d1.w)
  4740.     rts
  4741. *@@:
  4742. *    dc.b     0, 1, 2, 3, 4, 5, 6, 7    *$60-$67
  4743. *    dc.b    16,17,18,19,20,21,22,23
  4744. *    dc.b     8, 9,10,11,12,13,14,15
  4745. *    dc.b    24,25,26,27,28,29,30,31
  4746.  
  4747. regope_AR:
  4748.     add.b    #$80,d1
  4749.     move.b    opmreg(a6,d1.w),d2
  4750.     andi.w    #$c0,d2
  4751.     or.b    (a0)+,d2
  4752.     jsr    (a4)            *opmset
  4753.     bra    next_cmd_fm
  4754.  
  4755. regope_KS:
  4756.     add.b    #$80,d1
  4757.     move.b    opmreg(a6,d1.w),d2
  4758.     andi.w    #$1f,d2
  4759.     move.b    (a0)+,d0
  4760.     ror.b    #2,d0
  4761.     or.b    d0,d2
  4762.     jsr    (a4)            *opmset
  4763.     bra    next_cmd_fm
  4764.  
  4765. regope_1DR:
  4766.     add.b    #$a0,d1
  4767.     move.b    opmreg(a6,d1.w),d2
  4768.     andi.w    #$c0,d2
  4769.     or.b    (a0)+,d2
  4770.     jsr    (a4)            *opmset
  4771.     bra    next_cmd_fm
  4772.  
  4773. regope_AMS_EN:
  4774.     add.b    #$a0,d1
  4775.     move.b    opmreg(a6,d1.w),d2
  4776.     andi.w    #$1f,d2
  4777.     move.b    (a0)+,d0
  4778.     ror.b    #1,d0
  4779.     or.b    d0,d2
  4780.     jsr    (a4)            *opmset
  4781.     bra    next_cmd_fm
  4782.  
  4783. regope_2DR:
  4784.     add.b    #$c0,d1
  4785.     move.b    opmreg(a6,d1.w),d2
  4786.     andi.w    #$c0,d2
  4787.     or.b    (a0)+,d2
  4788.     jsr    (a4)            *opmset
  4789.     bra    next_cmd_fm
  4790.  
  4791. regope_DT2:
  4792.     add.b    #$c0,d1
  4793.     move.b    opmreg(a6,d1.w),d2
  4794.     andi.w    #$1f,d2
  4795.     move.b    (a0)+,d0
  4796.     ror.b    #2,d0
  4797.     or.b    d0,d2
  4798.     jsr    (a4)            *opmset
  4799.     bra    next_cmd_fm
  4800.  
  4801. regope_RR:
  4802.     add.b    #$e0,d1
  4803.     move.b    opmreg(a6,d1.w),d2
  4804.     andi.w    #$f0,d2
  4805.     or.b    (a0)+,d2
  4806.     jsr    (a4)            *opmset
  4807.     bra    next_cmd_fm
  4808.  
  4809. regope_1DL:
  4810.     add.b    #$e0,d1
  4811.     move.b    opmreg(a6,d1.w),d2
  4812.     andi.w    #$0f,d2
  4813.     move.b    (a0)+,d0
  4814.     lsl.b    #4,d0
  4815.     or.b    d0,d2
  4816.     jsr    (a4)            *opmset
  4817.     bra    next_cmd_fm
  4818.  
  4819. not_op_reg:
  4820.     andi.w    #$7f,d1
  4821.     subq.w    #4,d1
  4822.     add.w    d1,d1
  4823.     move.w    opmregope2(pc,d1.w),d0
  4824.     jmp    opmregope2(pc,d0.w)
  4825.  
  4826. opmregope2:
  4827.     dc.w    regope_NFRQ-opmregope2        *4
  4828.     dc.w    regope_NE-opmregope2        *5
  4829.     dc.w    regope_LFRQ-opmregope2        *6
  4830.     dc.w    regope_PMD-opmregope2        *7
  4831.     dc.w    regope_AMD-opmregope2        *8
  4832.     dc.w    regope_WF-opmregope2        *9
  4833.     dc.w    regope_CON-opmregope2        *10
  4834.     dc.w    regope_FB-opmregope2        *11
  4835.     dc.w    regope_PAN-opmregope2        *12
  4836.     dc.w    regope_AMS-opmregope2        *13
  4837.     dc.w    regope_PMS-opmregope2        *14
  4838.  
  4839. regope_NFRQ:
  4840.     moveq.l    #15,d1            *noise frq
  4841.     move.b    opmreg(a6,d1.w),d2
  4842.     andi.w    #$80,d2
  4843.     or.b    (a0)+,d2
  4844.     jsr    (a4)            *opmset
  4845.     bra    next_cmd_fm
  4846.  
  4847. regope_NE:
  4848.     moveq.l    #15,d1            *noise switch
  4849.     move.b    opmreg(a6,d1.w),d2
  4850.     andi.w    #$1f,d2
  4851.     move.b    (a0)+,d0
  4852.     ror.b    #1,d0
  4853.     or.b    d0,d2
  4854.     jsr    (a4)            *opmset
  4855.     bra    next_cmd_fm
  4856.  
  4857. regope_LFRQ:
  4858.     moveq.l    #$18,d1            *LFRQ
  4859.     move.b    (a0)+,d2
  4860.     jsr    (a4)            *opmset
  4861.     bra    next_cmd_fm
  4862.  
  4863. regope_PMD:
  4864.     moveq.l    #$19,d1            *PMD
  4865.     move.b    (a0)+,d2
  4866.     tas.b    d2
  4867.     jsr    (a4)            *opmset
  4868.     bra    next_cmd_fm
  4869.  
  4870. regope_AMD:
  4871.     moveq.l    #$19,d1            *AMD
  4872.     move.b    (a0)+,d2
  4873.     andi.b    #$7f,d2
  4874.     jsr    (a4)            *opmset
  4875.     bra    next_cmd_fm
  4876.  
  4877. regope_WF:
  4878.     moveq.l    #$1b,d1            *WF
  4879.     move.b    opmreg(a6,d1.w),d2
  4880.     andi.b    #$fc,d2
  4881.     move.b    (a0)+,d0
  4882.     andi.b    #3,d0
  4883.     or.b    d0,d2
  4884.     jsr    (a4)            *opmset
  4885.     bra    next_cmd_fm
  4886.  
  4887. regope_CON:
  4888.     moveq.l    #$20,d1
  4889.     add.b    d4,d1
  4890.     move.b    opmreg(a6,d1.w),d2
  4891.     andi.w    #$f8,d2
  4892.     or.b    (a0)+,d2
  4893.     jsr    (a4)            *opmset
  4894.     bra    next_cmd_fm
  4895.  
  4896. regope_FB:
  4897.     moveq.l    #$20,d1
  4898.     add.b    d4,d1
  4899.     move.b    opmreg(a6,d1.w),d2
  4900.     andi.w    #$c7,d2
  4901.     move.b    (a0)+,d0
  4902.     lsl.b    #3,d0
  4903.     or.b    d0,d2
  4904.     jsr    (a4)            *opmset
  4905.     bra    next_cmd_fm
  4906.  
  4907. regope_PAN:
  4908.     moveq.l    #$20,d1
  4909.     add.b    d4,d1
  4910.     move.b    opmreg(a6,d1.w),d2
  4911.     andi.w    #$3f,d2
  4912.     move    (a0)+,d0
  4913.     ror.b    #2,d0
  4914.     or.b    d0,d2
  4915.     jsr    (a4)            *opmset
  4916.     bra    next_cmd_fm
  4917.  
  4918. regope_AMS:
  4919.     moveq.l    #$38,d1
  4920.     add.b    d4,d1
  4921.     move.b    opmreg(a6,d1.w),d2
  4922.     andi.w    #$f0,d2
  4923.     or.b    (a0)+,d2
  4924.     jsr    (a4)            *opmset
  4925.     bra    next_cmd_fm
  4926.  
  4927. regope_PMS:
  4928.     moveq.l    #$38,d1
  4929.     add.b    d4,d1
  4930.     move.b    opmreg(a6,d1.w),d2
  4931.     andi.w    #$0f,d2
  4932.     move.b    (a0)+,d0
  4933.     lsl.b    #4,d0
  4934.     or.b    d0,d2
  4935.     jsr    (a4)            *opmset
  4936.     bra    next_cmd_fm
  4937. *-----------------------------------------------------------------------------
  4938. rltv_opm_regset_fm:
  4939.     move.l    p_opmset(a5),a4
  4940.     move.b    (a0)+,d1        *reg ID
  4941.     bmi    r_not_op_reg
  4942.     move.b    d1,d0
  4943.     andi.w    #$f0,d1
  4944.     lsr.b    #1,d1
  4945.     add.b    d4,d1
  4946.     andi.w    #$0f,d0
  4947.     add.w    d0,d0
  4948.     move.w    r_opmregope(pc,d0.w),d0
  4949.     jmp    r_opmregope(pc,d0.w)
  4950. r_opmregope:
  4951.     dc.w    r_regope_MUL-r_opmregope    *0
  4952.     dc.w    r_regope_DT1-r_opmregope    *1
  4953.     dc.w    r_regope_TL-r_opmregope        *2
  4954.     dc.w    r_regope_AR-r_opmregope        *3
  4955.     dc.w    r_regope_KS-r_opmregope        *4
  4956.     dc.w    r_regope_1DR-r_opmregope    *5
  4957.     dc.w    r_regope_AMS_EN-r_opmregope    *6
  4958.     dc.w    r_regope_2DR-r_opmregope    *7
  4959.     dc.w    r_regope_DT2-r_opmregope    *8
  4960.     dc.w    r_regope_RR-r_opmregope        *9
  4961.     dc.w    r_regope_1DL-r_opmregope    *10
  4962.  
  4963. r_regope_MUL:
  4964.     add.b    #$40,d1
  4965.     move.b    opmreg(a6,d1.w),d2
  4966.     move.l    d2,d3
  4967.     andi.w    #$0f,d3
  4968.     move.b    (a0)+,d0
  4969.     bmi    rrM1
  4970.     add.b    d0,d3
  4971.     cmpi.b    #15,d3
  4972.     bls    @f
  4973.     moveq.l    #15,d3
  4974.     bra    @f
  4975. rrM1:
  4976.     add.b    d0,d3
  4977.     bpl    @f
  4978.     moveq.l    #0,d3
  4979. @@:
  4980.     andi.w    #$f0,d2
  4981.     or.b    d3,d2
  4982.     jsr    (a4)            *opmset
  4983.     bra    next_cmd_fm
  4984.  
  4985. r_regope_DT1:
  4986.     add.b    #$40,d1
  4987.     move.b    opmreg(a6,d1.w),d2
  4988.     move.l    d2,d3
  4989.     lsr.b    #4,d3
  4990.     andi.b    #7,d3
  4991.     move.b    (a0)+,d0
  4992.     bmi    rrD1
  4993.     add.b    d0,d3
  4994.     cmpi.b    #7,d3
  4995.     bls    @f
  4996.     moveq.l    #7,d3
  4997.     bra    @f
  4998. rrD1:
  4999.     add.b    d0,d3
  5000.     bpl    @f
  5001.     moveq.l    #0,d3
  5002. @@:
  5003.     andi.w    #$0f,d2
  5004.     lsl.b    #4,d3
  5005.     or.b    d3,d2
  5006.     jsr    (a4)            *opmset
  5007.     bra    next_cmd_fm
  5008.  
  5009. r_regope_TL:
  5010.     add.b    #$60,d1
  5011.     move.b    opmreg(a6,d1.w),d2
  5012.     andi.b    #$7f,d2
  5013.     move.b    (a0)+,d0
  5014.     bmi    rrT1
  5015.     add.b    d0,d2
  5016.     cmpi.b    #127,d2
  5017.     bls    @f
  5018.     moveq.l    #127,d2
  5019.     bra    @f
  5020. rrT1:
  5021.     add.b    d0,d2
  5022.     bpl    @f
  5023.     moveq.l    #0,d2
  5024. @@:
  5025.     jsr    (a4)            *opmset
  5026.     bsr    set_to_olwk
  5027.     bra    next_cmd_fm
  5028.  
  5029. r_regope_AR:
  5030.     add.b    #$80,d1
  5031.     move.b    opmreg(a6,d1.w),d2
  5032.     move.l    d2,d3
  5033.     andi.w    #$1f,d3
  5034.     move.b    (a0)+,d0
  5035.     bmi    rrA1
  5036.     add.b    d0,d3
  5037.     cmpi.b    #$1f,d3
  5038.     bls    @f
  5039.     moveq.l    #$1f,d3
  5040.     bra    @f
  5041. rrA1:
  5042.     add.b    d0,d3
  5043.     bpl    @f
  5044.     moveq.l    #0,d3
  5045. @@:
  5046.     andi.w    #$c0,d2
  5047.     or.b    d3,d2
  5048.     jsr    (a4)            *opmset
  5049.     bra    next_cmd_fm
  5050.  
  5051. r_regope_KS:
  5052.     add.b    #$80,d1
  5053.     move.b    opmreg(a6,d1.w),d2
  5054.     move.l    d2,d3
  5055.     rol.b    #2,d3
  5056.     andi.w    #3,d3
  5057.     move.b    (a0)+,d0
  5058.     bmi    rrK1
  5059.     add.b    d0,d3
  5060.     cmpi.b    #3,d3
  5061.     bls    @f
  5062.     moveq.l    #3,d3
  5063.     bra    @f
  5064. rrK1:
  5065.     add.b    d0,d3
  5066.     bpl    @f
  5067.     moveq.l    #0,d3
  5068. @@:
  5069.     ror.b    #2,d3
  5070.     or.b    d3,d2
  5071.     jsr    (a4)            *opmset
  5072.     bra    next_cmd_fm
  5073.  
  5074. r_regope_1DR:
  5075.     add.b    #$a0,d1
  5076.     move.b    opmreg(a6,d1.w),d2
  5077.     move.l    d2,d3
  5078.     andi.w    #$1f,d3
  5079.     move.b    (a0)+,d0
  5080.     bmi    rr1DR
  5081.     add.b    d0,d3
  5082.     cmpi.b    #$1f,d3
  5083.     bls    @f
  5084.     moveq.l    #$1f,d3
  5085.     bra    @f
  5086. rr1DR:
  5087.     add.b    d0,d3
  5088.     bpl    @f
  5089.     moveq.l    #0,d3
  5090. @@:
  5091.     andi.w    #$c0,d2
  5092.     or.b    d3,d2
  5093.     jsr    (a4)            *opmset
  5094.     bra    next_cmd_fm
  5095.  
  5096. r_regope_AMS_EN:
  5097.     add.b    #$a0,d1
  5098.     move.b    opmreg(a6,d1.w),d2
  5099.     move.l    d2,d3
  5100.     rol.b    #1,d3
  5101.     andi.w    #1,d3
  5102.     move.b    (a0)+,d0
  5103.     bmi    rrAE
  5104.     add.b    d0,d3
  5105.     cmpi.b    #1,d3
  5106.     bls    @f
  5107.     moveq.l    #1,d3
  5108.     bra    @f
  5109. rrAE:
  5110.     add.b    d0,d3
  5111.     bpl    @f
  5112.     moveq.l    #0,d3
  5113. @@:
  5114.     andi.w    #$1f,d2
  5115.     ror.b    #1,d3
  5116.     or.b    d3,d2
  5117.     jsr    (a4)            *opmset
  5118.     bra    next_cmd_fm
  5119.  
  5120. r_regope_2DR:
  5121.     add.b    #$c0,d1
  5122.     move.b    opmreg(a6,d1.w),d2
  5123.     move.l    d2,d3
  5124.     andi.w    #$1f,d3
  5125.     move.b    (a0)+,d0
  5126.     bmi    rr2D
  5127.     add.b    d0,d3
  5128.     cmpi.b    #$1f,d3
  5129.     bls    @f
  5130.     moveq.l    #$1f,d3
  5131.     bra    @f
  5132. rr2D:
  5133.     add.b    d0,d3
  5134.     bpl    @f
  5135.     moveq.l    #0,d3
  5136. @@:
  5137.     andi.w    #$c0,d2
  5138.     or.b    d3,d2
  5139.     jsr    (a4)            *opmset
  5140.     bra    next_cmd_fm
  5141.  
  5142. r_regope_DT2:
  5143.     add.b    #$c0,d1
  5144.     move.b    opmreg(a6,d1.w),d2
  5145.     move.b    d2,d3
  5146.     rol.b    #2,d3
  5147.     andi.w    #3,d2
  5148.     move.b    (a0)+,d0
  5149.     bmi    rrD2
  5150.     add.b    d0,d3
  5151.     cmpi.b    #3,d3
  5152.     bls    @f
  5153.     moveq.l    #3,d3
  5154.     bra    @f
  5155. rrD2:
  5156.     add.b    d0,d3
  5157.     bpl    @f
  5158.     moveq.l    #0,d3
  5159. @@:
  5160.     ror.b    #2,d3
  5161.     or.b    d3,d2
  5162.     jsr    (a4)            *opmset
  5163.     bra    next_cmd_fm
  5164.  
  5165. r_regope_RR:
  5166.     add.b    #$e0,d1
  5167.     move.b    opmreg(a6,d1.w),d2
  5168.     move.l    d2,d3
  5169.     andi.w    #$1f,d3
  5170.     move.b    (a0)+,d0
  5171.     bmi    rrR1
  5172.     add.b    d0,d3
  5173.     cmpi.b    #$0f,d3
  5174.     bls    @f
  5175.     moveq.l    #$0f,d3
  5176.     bra    @f
  5177. rrR1:
  5178.     andi.w    #$f0,d2
  5179.     or.b    d3,d2
  5180.     jsr    (a4)            *opmset
  5181.     bra    next_cmd_fm
  5182.  
  5183. r_regope_1DL:
  5184.     add.b    #$e0,d1
  5185.     move.b    opmreg(a6,d1.w),d2
  5186.     move.l    d2,d3
  5187.     lsr.b    #4,d3
  5188.     move.b    (a0)+,d0
  5189.     bmi    rr1DL
  5190.     add.b    d0,d3
  5191.     cmpi.b    #$0f,d3
  5192.     bls    @f
  5193.     moveq.l    #$0f,d3
  5194.     bra    @f
  5195. rr1DL:
  5196.     andi.w    #$0f,d2
  5197.     lsl.b    #4,d3
  5198.     or.b    d3,d2
  5199.     jsr    (a4)            *opmset
  5200.     bra    next_cmd_fm
  5201.  
  5202. r_not_op_reg:
  5203.     andi.w    #$7f,d1
  5204.     subq.w    #4,d1
  5205.     add.w    d1,d1
  5206.     move.w    r_opmregope2(pc,d0.w),d0
  5207.     jmp    r_opmregope2(pc,d0.w)
  5208.  
  5209. r_opmregope2:
  5210.     dc.w    r_regope_NFRQ-r_opmregope2        *4
  5211.     dc.w    r_regope_NE-r_opmregope2        *5
  5212.     dc.w    r_regope_LFRQ-r_opmregope2        *6
  5213.     dc.w    r_regope_PMD-r_opmregope2        *7
  5214.     dc.w    r_regope_AMD-r_opmregope2        *8
  5215.     dc.w    r_regope_WF-r_opmregope2        *9
  5216.     dc.w    r_regope_CON-r_opmregope2        *10
  5217.     dc.w    r_regope_FB-r_opmregope2        *11
  5218.     dc.w    r_regope_PAN-r_opmregope2        *12
  5219.     dc.w    r_regope_AMS-r_opmregope2        *13
  5220.     dc.w    r_regope_PMS-r_opmregope2        *14
  5221.  
  5222. r_regope_NFRQ:
  5223.     moveq.l    #15,d1            *noise frq
  5224.     move.b    opmreg(a6,d1.w),d2
  5225.     move.l    d2,d3
  5226.     andi.w    #$1f,d3
  5227.     move.b    (a0)+,d0
  5228.     bmi    rrNF
  5229.     add.b    d0,d3
  5230.     cmpi.b    #$1f,d3
  5231.     bls    @f
  5232.     moveq.l    #$1f,d3
  5233.     bra    @f
  5234. rrNF:
  5235.     add.b    d0,d3
  5236.     bpl    @f
  5237.     moveq.l    #0,d3
  5238. @@:
  5239.     andi.w    #$80,d2
  5240.     or.b    d3,d2
  5241.     jsr    (a4)            *opmset
  5242.     bra    next_cmd_fm
  5243.  
  5244. r_regope_NE:
  5245.     moveq.l    #15,d1            *noise switch
  5246.     move.b    opmreg(a6,d1.w),d2
  5247.     move.l    d2,d3
  5248.     andi.w    #$80,d3
  5249.     rol.b    #1,d3
  5250.     move.b    (a0)+,d0
  5251.     bmi    rrNE
  5252.     add.b    d0,d3
  5253.     cmpi.b    #1,d3
  5254.     bls    @f
  5255.     moveq.l    #1,d3
  5256.     bra    @f
  5257. rrNE:
  5258.     add.b    d0,d3
  5259.     bpl    @f
  5260.     moveq.l    #0,d3
  5261. @@:
  5262.     andi.w    #$1f,d2
  5263.     ror.b    #1,d3
  5264.     or.b    d3,d2
  5265.     jsr    (a4)            *opmset
  5266.     bra    next_cmd_fm
  5267.  
  5268. r_regope_LFRQ:
  5269.     moveq.l    #$18,d1            *LFRQ
  5270.     moveq.l    #0,d2
  5271.     move.b    opmreg(a6,d1.w),d2
  5272.     move.b    (a0)+,d0
  5273.     ext.w    d0
  5274.     bmi    rrLF
  5275.     add.w    d0,d2
  5276.     cmpi.w    #255,d2
  5277.     bls    @f
  5278.     moveq.l    #255,d2
  5279.     bra    @f
  5280. rrLF:
  5281.     add.w    d0,d2
  5282.     bpl    @f
  5283.     moveq.l    #0,d2
  5284. @@:
  5285.     jsr    (a4)            *opmset
  5286.     bra    next_cmd_fm
  5287.  
  5288. r_regope_PMD:
  5289.     moveq.l    #$19,d1            *PMD
  5290.     move.b    opmreg(a6,d1.w),d2
  5291.     andi.w    #$7f,d2
  5292.     move.b    (a0)+,d0
  5293.     bmi    rrPMD
  5294.     add.b    d0,d2
  5295.     cmpi.b    #127,d2
  5296.     bls    @f
  5297.     moveq.l    #127,d2
  5298.     bra    @f
  5299. rrPMD:
  5300.     add.b    d0,d2
  5301.     bpl    @f
  5302.     moveq.l    #0,d2
  5303. @@:
  5304.     tas.b    d2
  5305.     jsr    (a4)            *opmset
  5306.     bra    next_cmd_fm
  5307.  
  5308. r_regope_AMD:
  5309.     moveq.l    #$19,d1            *AMD
  5310.     move.b    opmreg(a6,d1.w),d2
  5311.     andi.w    #$7f,d2
  5312.     move.b    (a0)+,d0
  5313.     bmi    rrAMD
  5314.     add.b    d0,d2
  5315.     cmpi.b    #127,d2
  5316.     bls    @f
  5317.     moveq.l    #127,d2
  5318.     bra    @f
  5319. rrAMD:
  5320.     add.b    d0,d2
  5321.     bpl    @f
  5322.     moveq.l    #0,d2
  5323. @@:
  5324.     jsr    (a4)            *opmset
  5325.     bra    next_cmd_fm
  5326.  
  5327. r_regope_WF:
  5328.     moveq.l    #$1b,d1            *WF
  5329.     move.b    opmreg(a6,d1.w),d2
  5330.     move.l    d2,d3
  5331.     andi.w    #3,d3
  5332.     move.b    (a0)+,d0
  5333.     bmi    rrWF
  5334.     add.b    d0,d3
  5335.     cmpi.b    #3,d3
  5336.     bls    @f
  5337.     moveq.l    #3,d3
  5338.     bra    @f
  5339. rrWF:
  5340.     add.b    d0,d3
  5341.     bpl    @f
  5342.     moveq.l    #0,d3
  5343. @@:
  5344.     andi.b    #$fc,d2
  5345.     or.b    d3,d2
  5346.     jsr    (a4)            *opmset
  5347.     bra    next_cmd_fm
  5348.  
  5349. r_regope_CON:
  5350.     moveq.l    #$20,d1
  5351.     add.b    d4,d1
  5352.     move.b    opmreg(a6,d1.w),d2
  5353.     move.l    d2,d3
  5354.     andi.w    #7,d3
  5355.     move.b    (a0)+,d0
  5356.     bmi    rrCON
  5357.     add.b    d0,d3
  5358.     cmpi.b    #7,d3
  5359.     bls    @f
  5360.     moveq.l    #7,d3
  5361.     bra    @f
  5362. rrCON:
  5363.     add.b    d0,d3
  5364.     bpl    @f
  5365.     moveq.l    #0,d3
  5366. @@:
  5367.     andi.w    #$f8,d2
  5368.     or.b    d3,d2
  5369.     jsr    (a4)            *opmset
  5370.     bra    next_cmd_fm
  5371.  
  5372. r_regope_FB:
  5373.     moveq.l    #$20,d1
  5374.     add.b    d4,d1
  5375.     move.b    opmreg(a6,d1.w),d2
  5376.     move.l    d2,d3
  5377.     lsr.b    #3,d3
  5378.     andi.w    #7,d3
  5379.     move.b    (a0)+,d0
  5380.     bmi    rrFB
  5381.     add.b    d0,d3
  5382.     cmpi.b    #7,d3
  5383.     bls    @f
  5384.     moveq.l    #7,d3
  5385.     bra    @f
  5386. rrFB:
  5387.     add.b    d0,d3
  5388.     bpl    @f
  5389.     moveq.l    #0,d3
  5390. @@:
  5391.     andi.w    #$c7,d2
  5392.     lsl.b    #3,d3
  5393.     or.b    d3,d2
  5394.     jsr    (a4)            *opmset
  5395.     bra    next_cmd_fm
  5396.  
  5397. r_regope_PAN:
  5398.     moveq.l    #$20,d1
  5399.     add.b    d4,d1
  5400.     move.b    opmreg(a6,d1.w),d2
  5401.     move.l    d2,d3
  5402.     rol.b    #2,d3
  5403.     andi.w    #3,d3
  5404.     move.b    (a0)+,d0
  5405.     bmi    rrPAN
  5406.     add.b    d0,d3
  5407.     cmpi.b    #3,d3
  5408.     bls    @f
  5409.     moveq.l    #3,d3
  5410.     bra    @f
  5411. rrPAN:
  5412.     add.b    d0,d3
  5413.     bpl    @f
  5414.     moveq.l    #0,d3
  5415. @@:
  5416.     andi.w    #$3f,d2
  5417.     ror.b    #2,d3
  5418.     or.b    d3,d2
  5419.     jsr    (a4)            *opmset
  5420.     bra    next_cmd_fm
  5421.  
  5422. r_regope_AMS:
  5423.     moveq.l    #$38,d1
  5424.     add.b    d4,d1
  5425.     move.b    opmreg(a6,d1.w),d2
  5426.     move.l    d2,d3
  5427.     andi.w    #3,d3
  5428.     move.b    (a0)+,d0
  5429.     bmi    rrAMS
  5430.     add.b    d0,d3
  5431.     cmpi.b    #3,d3
  5432.     bls    @f
  5433.     moveq.l    #3,d3
  5434.     bra    @f
  5435. rrAMS:
  5436.     add.b    d0,d3
  5437.     bpl    @f
  5438.     moveq.l    #0,d3
  5439. @@:
  5440.     andi.w    #$f0,d2
  5441.     or.b    d3,d2
  5442.     jsr    (a4)        *opmset
  5443.     bra    next_cmd_fm
  5444.  
  5445. r_regope_PMS:
  5446.     moveq.l    #$38,d1
  5447.     add.b    d4,d1
  5448.     move.b    opmreg(a6,d1.w),d2
  5449.     move.l    d2,d3
  5450.     lsr.w    #4,d3
  5451.     andi.w    #7,d3
  5452.     move.b    (a0)+,d0
  5453.     bmi    rrPMS
  5454.     add.b    d0,d3
  5455.     cmpi.b    #7,d3
  5456.     bls    @f
  5457.     moveq.l    #7,d3
  5458.     bra    @f
  5459. rrPMS:
  5460.     add.b    d0,d3
  5461.     bpl    @f
  5462.     moveq.l    #0,d3
  5463. @@:
  5464.     andi.w    #$0f,d2
  5465.     lsl.b    #4,d3
  5466.     or.b    d3,d2
  5467.     jsr    (a4)            *opmset
  5468.     bra    next_cmd_fm
  5469. *------------------------------------------------------------------------------
  5470. reg_set_ad:                *ADPCM Yコマンド
  5471.     pea    next_cmd_ad(pc)
  5472.     lea    set_dtn_ad(pc),a1
  5473.     move.b    (a0)+,d1        *reg number
  5474.     move.b    (a0)+,d2        *data
  5475.     bra    @f
  5476.  
  5477. reg_set_fm:                *FM Yコマンド
  5478.     pea    next_cmd_fm(pc)
  5479.     lea    set_dtn_fm(pc),a1
  5480.     move.b    (a0)+,d1        *reg number
  5481.     move.b    (a0)+,d2        *data
  5482. @@:
  5483.     cmpi.b    #$02,d1            *emulate opmd.x y2,n
  5484.     beq    opmd_y2
  5485.     cmpi.b    #$03,d1            *emulate opmd.x y3,n
  5486.     beq    opmd_y3
  5487.     cmpi.b    #13,d1            *emulate opmd.x y13,n
  5488.     beq    opmd_y13
  5489.     cmpi.b    #14,d1            *emulate opmd.x y14,n
  5490.     beq    opmd_y14
  5491.     cmpi.b    #48,d1            *KFか
  5492.     bcs    @f
  5493.     cmpi.b    #55,d1
  5494.     bhi    @f
  5495.     addq.w    #4,sp            *peaを無効にする。(ちょっと無駄)
  5496.     andi.w    #$ff,d2
  5497.     lsr.w    #2,d2
  5498.     move.w    d2,p_detune(a5)
  5499.     jmp    (a1)
  5500. @@:
  5501.     move.l    p_opmset(a5),a4
  5502.     jsr    (a4)            *opmset
  5503.     cmpi.b    #$60,d1
  5504.     bcs    @f
  5505.     cmpi.b    #$7f,d1
  5506.     bls    set_to_olwk
  5507. @@:
  5508.     rts
  5509.  
  5510. opmd_y2:                *OPMD式ノートオン
  5511.     cmp.w    adpcm_n_max(pc),d2    *データが存在しない
  5512.     bcc    @f
  5513.     move.l    d2,d3
  5514.     move.w    p_frq(a5),d2        *d2.lb=p_pan(a5)  d2.hb=p_frq(a5)
  5515.     bsr    conv_p@p        *0-127→1-3
  5516.     move.w    d2,d1            *d1=frq/pan
  5517.     moveq.l    #254,d6            *ch
  5518.     move.l    d3,d2
  5519.     jmp    se_adpcm2
  5520. @@:
  5521.     rts
  5522.  
  5523. opmd_y3:                *OPMD式 ADPCMパンポット指定
  5524.     move.b    d2,p_pan(a5)
  5525.     bra    do_adpcm_pan
  5526.  
  5527. opmd_y13:                *OPMD式 ADPCM FRQ設定
  5528.     move.l    d2,d1
  5529.     move.b    d1,p_frq(a5)
  5530.     bra    do_adpcm_frq
  5531.  
  5532. opmd_y14:                *OPMD式 効果音モード設定
  5533.     tst.b    d2
  5534.     sne.b    se_mode-work(a6)
  5535.     rts
  5536.  
  5537. reg_set_md:                *MIDI Yコマンド
  5538.     bsr    timbre_set2        *!97/4/1
  5539.     moveq.l    #$b0,d0
  5540.     or.b    d4,d0            *ctrl chg
  5541.     jsr    (a2)
  5542.     move.b    (a0)+,d0        *reg number
  5543.     jsr    (a2)
  5544.     move.b    (a0)+,d0        *data value
  5545.     jsr    (a2)
  5546.     bra    next_cmd_md
  5547. *------------------------------------------------------------------------------
  5548. Q_gate_fm:
  5549.     move.b    (a0)+,p_Q_gate+0(a5)
  5550.     move.b    (a0)+,p_Q_gate+1(a5)
  5551.     bra    next_cmd_fm
  5552.  
  5553. Q_gate_ad:
  5554.     move.b    (a0)+,p_Q_gate+0(a5)
  5555.     move.b    (a0)+,p_Q_gate+1(a5)
  5556.     bra    next_cmd_ad
  5557.  
  5558. Q_gate_md:
  5559.     move.b    (a0)+,p_Q_gate+0(a5)
  5560.     move.b    (a0)+,p_Q_gate+1(a5)
  5561.     bra    next_cmd_md
  5562. *------------------------------------------------------------------------------
  5563. track_delay_fm            *トラックディレイ(FM)
  5564.     bsr    get_steptime
  5565.     move.w    d1,(a5)
  5566.     beq    next_cmd_fm
  5567.     rts
  5568.  
  5569. track_delay_md            *トラックディレイ(MIDI)
  5570.     bsr    get_steptime
  5571.     move.w    d1,(a5)
  5572.     beq    next_cmd_md
  5573.     rts
  5574.  
  5575. track_delay_ad            *トラックディレイ(ADPCM)
  5576.     bsr    get_steptime
  5577.     move.w    d1,(a5)
  5578.     beq    next_cmd_ad
  5579.     rts
  5580. *------------------------------------------------------------------------------
  5581. len0_note_fm:
  5582.     move.b    (a0)+,d7        *note
  5583.     bsr    do_transpose
  5584.     bsr    get_def_velo        *velocity
  5585.     clr.w    (a5)            *0 step
  5586.     lea    INF_GATE.w,a2        *∞ gate
  5587.     move.l    p_opmset(a5),a1
  5588.     bra    do_note_on_fm
  5589.  
  5590. len0_note_ad:
  5591.     move.b    (a0)+,d7        *note
  5592.     bsr    do_transpose
  5593.     bsr    get_def_velo        *velocity
  5594.     clr.w    (a5)            *0 step
  5595.     moveq.l    #INF_GATE,d2        *∞ gate
  5596.     bra    do_note_on_ad
  5597.  
  5598. len0_note_md:
  5599.     move.b    (a0)+,d7        *note
  5600.     bsr    do_transpose
  5601.     bsr    get_def_velo        *velocity
  5602.     clr.w    (a5)            *0 step
  5603.     moveq.l    #INF_GATE,d2        *∞ gate
  5604.     lea    p_note(a5),a1
  5605.     move.l    p_midi_trans(a5),a2
  5606.     moveq.l    #max_note_on-1,d5
  5607.     tst.b    p_track_mode(a5)
  5608.     bmi    do_note_on_md        *キーオフなし
  5609. @@:                    *以下ステップタイム=0のケース
  5610.     tst.b    (a1)
  5611.     bmi    do_note_on_md
  5612.     addq.w    #k_note_len,a1
  5613.     dbra    d5,@b
  5614.                     *いちばん古い音を強制的にキーオフ
  5615.     moveq.l    #max_note_on-1-1,d5    *1回少なくする
  5616.     lea    p_note(a5),a1
  5617.     moveq.l    #$90,d0
  5618.     add.b    d4,d0
  5619.     jsr    (a2)            *send cmd
  5620.     move.b    (a1),d0
  5621.     jsr    (a2)            *note number
  5622.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  5623.     moveq.l    #$00,d0
  5624.     jsr    (a2)            *#0
  5625. @@:
  5626.     move.l    k_note_len(a1),(a1)+    *詰める処理
  5627.     dbmi    d5,@b
  5628.     bra    do_note_on_md
  5629. *------------------------------------------------------------------------------
  5630. do_transpose:            *トランスポーズ
  5631.     * < d7.b=note number
  5632.     * > d7.b=calculated note number
  5633.     * x d6
  5634.     move.b    p_transpose(a5),d6
  5635.     beq    exit_dotrp
  5636.     bpl    @f
  5637.     add.b    d6,d7
  5638.     bpl    exit_dotrp
  5639.     moveq.l    #0,d7
  5640.     bra    exit_dotrp
  5641. @@:
  5642.     add.b    d6,d7
  5643.     bcc    exit_dotrp
  5644.     moveq.l    #127,d7
  5645. exit_dotrp:
  5646.     rts
  5647. *------------------------------------------------------------------------------
  5648. portament_fm:
  5649. portament2_fm:
  5650.     bsr    get_port_param
  5651.     bsr    calc_port_param
  5652.     bra    case_key_patch_fm
  5653.  
  5654. get_port_param:
  5655.     st.b    p_port_flg(a5)
  5656.     move.b    (a0)+,d7        *source note
  5657.     bmi    prtmntm1        *src note=0-127のときはディレイなし
  5658.     clr.w    p_port_dly(a5)        *src note=128-255のときはディレイあり
  5659.     move.b    (a0)+,d6        *dest note=128-255のときはポルタメントタイムあり
  5660.     bmi    prtmntm2        *dest note=0-127のときはポルタメントタイムなし
  5661. prtmntm0:                *ポルタメントタイム省略(ディレイも省略)
  5662.     bsr    get_st_gt_vl        *d1=step time
  5663.     move.w    d1,p_port_cnt(a5)
  5664.     rts
  5665. prtmntm1:
  5666.     move.b    (a0)+,d6        *dest note
  5667.     bpl    prtmntm3        *ポルタメントタイム無しへ(delay only)
  5668.     moveq.l    #0,d0
  5669.     move.b    (a0)+,d0        *get delay
  5670.     bpl    @f
  5671.     add.b    d0,d0            *kill 7bit
  5672.     lsl.w    #7,d0
  5673.     move.b    (a0)+,d0
  5674. @@:
  5675.     move.w    d0,p_port_dly(a5)
  5676. prtmntm2:                *portament time
  5677.     moveq.l    #0,d0
  5678.     move.b    (a0)+,d0        *get portament time
  5679.     bpl    @f
  5680.     add.b    d0,d0            *kill 7bit
  5681.     lsl.w    #7,d0
  5682.     move.b    (a0)+,d0
  5683. @@:
  5684.     move.w    d0,p_port_cnt(a5)
  5685.     bra    get_st_gt_vl        *d1.w=step time
  5686. prtmntm3:                *delay only
  5687.     moveq.l    #0,d0
  5688.     move.b    (a0)+,d0        *get delay
  5689.     bpl    @f
  5690.     add.b    d0,d0            *kill 7bit
  5691.     lsl.w    #7,d0
  5692.     move.b    (a0)+,d0
  5693. @@:
  5694.     move.w    d0,p_port_dly(a5)
  5695.     bsr    get_st_gt_vl
  5696.     sub.w    p_port_dly(a5),d1
  5697.     move.w    d1,p_port_cnt(a5)
  5698.     rts
  5699.  
  5700. calc_port_param:            *FM/ADPCM用パラメータ計算
  5701.     * < d7=source note
  5702.     * < d6=destination note
  5703.     andi.l    #$7f,d6            *make it 0-127
  5704.     andi.w    #$7f,d7            *make it 0-127
  5705.     move.b    d6,p_last_note(a5)    *ポルタメントの場合はデスティネーションをここへ
  5706.     moveq.l    #0,d1
  5707.     move.l    d1,p_port_pitch(a5)    *ちゃっかり初期化
  5708.     move.l    d1,p_port_step(a5)    *一応初期化
  5709.     move.w    p_port_cnt(a5),d1
  5710.     beq    1f
  5711.     sub.w    d7,d6
  5712.     bmi    @f
  5713.     asl.w    #6,d6
  5714. clprpl_fm:
  5715.     divu    d1,d6        *d6=range/L d6.w=step counter
  5716.     move.w    d6,d0
  5717.     clr.w    d6
  5718.     divu    d1,d6        *d6=d6/L
  5719.     swap    d0
  5720.     move.w    d6,d0
  5721.     addq.l    #1,d0
  5722.     move.l    d0,p_port_step(a5)
  5723.     rts
  5724. @@:
  5725.     neg.w    d6
  5726.     asl.w    #6,d6
  5727. clprmi_fm:
  5728.     divu    d1,d6        *d6=range/L d6.w=step counter
  5729.     move.w    d6,d0
  5730.     clr.w    d6
  5731.     divu    d1,d6        *d6=d6/L
  5732.     swap    d0
  5733.     move.w    d6,d0
  5734.     neg.l    d0
  5735.     move.l    d0,p_port_step(a5)
  5736. 1:
  5737.     rts
  5738.  
  5739. calc_autoport_param    macro    xx
  5740.     * < d1.w=step
  5741.     * < d7.w=key
  5742.     * x d0,d1,d5,d6
  5743.     moveq.l    #0,d5
  5744.     move.l    d5,p_port_pitch(a5)    *ちゃっかり初期化
  5745.     move.l    d5,p_port_step(a5)    *一応初期化
  5746.     move.b    p_last_note(a5),d0
  5747.     bmi    2f
  5748.     move.b    d7,p_last_note(a5)
  5749.     move.w    p_port2_dly(a5),d5    *auto portament interval
  5750.     bpl    @f
  5751.     add.w    d5,d1
  5752.     ble    2f
  5753.     move.w    d1,p_port_dly(a5)
  5754.     move.w    d5,d1
  5755.     neg.w    d1
  5756.     bra    1f
  5757. @@:
  5758.     move.w    d5,p_port_dly(a5)
  5759.     sub.w    d5,d1
  5760.     ble    2f            *ポルタメントタイムが0になっては意味がない
  5761. 1:
  5762.     move.w    p_port2_cnt(a5),d6
  5763.     beq    1f
  5764.     bpl    @f
  5765.     add.w    d6,d1
  5766.     bgt    1f
  5767.     sub.w    d6,d1
  5768.     bra    1f            *ポルタメントタイムが0になっては意味がない
  5769. @@:
  5770.     cmp.w    d1,d6
  5771.     bcc    1f
  5772.     move.l    d6,d1
  5773. 1:
  5774.     move.w    d1,p_port_cnt(a5)
  5775.     move.l    d7,d6
  5776.     move.b    d0,d7
  5777.     sub.b    d0,d6
  5778.     bpl    @f
  5779.     neg.b    d6
  5780.     asl.w    #6,d6
  5781.     divu    d1,d6        *d6=range/L d6.w=step counter
  5782.     move.w    d6,d0
  5783.     clr.w    d6
  5784.     divu    d1,d6        *d6=d6/L
  5785.     swap    d0
  5786.     move.w    d6,d0
  5787.     neg.l    d0
  5788.     move.l    d0,p_port_step(a5)
  5789.     bra    case_key_patch_&xx
  5790. @@:
  5791.     asl.w    #6,d6
  5792.     divu    d1,d6        *d6=range/L d6.w=step counter
  5793.     move.w    d6,d0
  5794.     clr.w    d6
  5795.     divu    d1,d6        *d6=d6/L
  5796.     swap    d0
  5797.     move.w    d6,d0
  5798.     addq.l    #1,d0
  5799.     move.l    d0,p_port_step(a5)
  5800.     bra    case_key_patch_&xx
  5801. 2:
  5802.     endm
  5803.  
  5804. case_key_fm:                *音符データ処理(FM)
  5805.     * < d7.b=key code
  5806.     bsr    get_st_gt_vl
  5807.     move.b    p_port2_flg(a5),p_port_flg(a5)    *オートポルタメントチェック/ポルタメントフラグ初期化
  5808.     beq    ckf0
  5809.     calc_autoport_param    fm
  5810. ckf0:
  5811.     clr.l    p_port_pitch(a5)
  5812.     move.b    d7,p_last_note(a5)    *前回のノートを保存
  5813. case_key_patch_fm:
  5814.     bsr    do_transpose
  5815.     move.l    p_opmset(a5),a1
  5816.     move.l    d2,a2            *preserve gatetime
  5817.     lea    p_note(a5),a4
  5818.     tst.w    d2
  5819.     beq    key_off_phase_fm
  5820.     move.b    p_how_many(a5),d6
  5821.     bmi    do_note_on_fm        *現在なにも鳴っていないなら即発音
  5822. *    tst.b    p_track_mode(a5)    *!5/10
  5823. *    bmi    do_note_on_fm        *!
  5824.     move.w    p_voice_rsv(a5),d5
  5825.     tst.w    (a5)
  5826.     bne    off_tient_fm
  5827.     move.w    d4,d0
  5828. 1:                    *以下ステップタイム=0のケース
  5829.     move.b    k_note(a4),d1
  5830.     bmi    @f
  5831.     cmp.b    d1,d7
  5832.     beq    same_note_fm        *同じノートナンバーを発見
  5833.     move.w    k_gate_time(a4),d2    *絶対音長0音符からのタイがあるか
  5834.     addq.w    #1,d2            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a4))
  5835.     bne    @f
  5836.     moveq.l    #8,d1
  5837.     move.b    opm_kon-work(a6,d0.w),d2
  5838.     and.b    opm_nom-work(a6,d0.w),d2
  5839.     jsr    (a1)                *opmset(タイの音を消す(< d1=8))
  5840.     tas.b    (a4)                *set note off mark
  5841.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  5842.     subq.b    #1,p_how_many(a5)        *!6/17
  5843. @@:
  5844.     addq.w    #k_note_len,a4
  5845.     addq.w    #1,d0
  5846.     andi.w    #7,d0
  5847.     dbra    d5,1b
  5848.     bra    do_note_on_fm
  5849. key_off_phase_fm:            *ゲートタイム=0はノートオフ指定として処理する
  5850.     tst.b    p_track_mode(a5)
  5851.     bmi    go_cpfm
  5852.     move.w    p_voice_rsv(a5),d5
  5853.     move.w    d4,d0
  5854. kfpflp00:
  5855.     cmp.b    k_note(a4),d7
  5856.     bne    @f
  5857.     moveq.l    #8,d1
  5858.     move.b    opm_kon-work(a6,d0.w),d2
  5859.     and.b    opm_nom-work(a6,d0.w),d2
  5860.     jsr    (a1)                *opmset(タイの音を消す(< d1=8))
  5861.     tas.b    (a4)                *set note off mark
  5862.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  5863.     subq.b    #1,p_how_many(a5)
  5864. @@:
  5865.     addq.w    #k_note_len,a4
  5866.     addq.w    #1,d0
  5867.     andi.w    #7,d0
  5868.     dbra    d5,kfpflp00
  5869.     bra    go_cpfm
  5870. off_tient_fm:                    *以下ステップタイム≠0のケース
  5871.     tst.b    d6                *鳴っているのが単音(d6=0)ならば
  5872.     bne    1f                *スラーかどうかチェック
  5873. csf_lp:
  5874.     move.l    (a4)+,d0
  5875.     bmi    @f
  5876.     addq.w    #1,d0                *タイ指定か(cmpi.w #TIE_GATE_CODE,d0)
  5877.     beq    case_slur_fm            *case:slur
  5878. @@:
  5879.     dbra    d5,csf_lp
  5880.     lea    p_note(a5),a4            *破壊してしまっているから再設定
  5881.     move.w    p_voice_rsv(a5),d5
  5882. 1:
  5883.     move.w    d4,d0
  5884. ktf_lp:
  5885.     move.b    k_note(a4),d1
  5886.     bmi    next_ktf
  5887.     cmp.b    d1,d7                *鳴っている音で同じノートナンバーを発見
  5888.     beq    same_note_fm
  5889.     move.w    k_gate_time(a4),d2        *絶対音長0音符からのタイがあるか
  5890.     beq    gtovwf                *ゲートタイム上書き
  5891.     addq.w    #1,d2            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a4))
  5892.     bne    next_ktf
  5893.     moveq.l    #8,d1
  5894.     move.b    opm_kon-work(a6,d0.w),d2
  5895.     and.b    opm_nom-work(a6,d0.w),d2
  5896.     jsr    (a1)                *opmset(タイの音を消す(< d1=8))
  5897.     tas.b    (a4)                *set note off mark
  5898.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  5899.     subq.b    #1,p_how_many(a5)        *!96/6/17
  5900.     bra    next_ktf
  5901. gtovwf:                        *c*0&e4のようなケースに対応
  5902.     move.w    a2,d2
  5903.     bmi    next_ktf
  5904.     move.w    a2,k_gate_time(a4)
  5905. next_ktf:
  5906.     addq.w    #k_note_len,a4
  5907.     addq.w    #1,d0
  5908.     andi.b    #7,d0
  5909.     dbra    d5,ktf_lp
  5910. do_note_on_fm:                *実際のノートオン処理
  5911.     move.w    p_voice_rsv(a5),d5
  5912.     move.b    p_how_many(a5),d2
  5913.     addq.b    #1,d2            *新しく発音しました
  5914.     cmp.b    d5,d2
  5915.     bls    1f
  5916.     btst.b    #b_voice_rsv,p_md_flg(a5)    *ボイスリザーブを行ったか
  5917.     bne    2f
  5918.     cmpi.w    #fm_ch_max-1,d5        *もうチャンネル一杯か
  5919.     beq    2f
  5920.     lea    p_note(a5),a4
  5921.     moveq.l    #0,d0
  5922. @@:                    *DVA処理
  5923.     tst.l    (a4)+
  5924.     bmi    3f
  5925.     addq.w    #1,d0            *空いているチャンネルを割り当てる
  5926.     dbra    d5,@b
  5927.     move.w    p_voice_rsv(a5),d5    *空きなしケース
  5928.     addq.w    #1,d5
  5929.     move.w    d5,p_voice_rsv(a5)
  5930. 1:
  5931.     move.b    d2,p_how_many(a5)    *新しく発音しました格納
  5932. 2:
  5933.     moveq.l    #0,d0
  5934.     move.b    p_next_on(a5),d0
  5935.     cmp.b    d5,d0
  5936.     bls    @f
  5937.     moveq.l    #0,d0                *始めに戻す
  5938. @@:
  5939.     move.l    d0,d1
  5940.     addq.b    #1,d1
  5941.     move.b    d1,p_next_on(a5)    *次回の発音チャンネル
  5942. 3:
  5943.     tst.b    p_track_mode(a5)        *!ダンパーなどの時は発音前にキーオフ
  5944.     bpl    @f                *!
  5945.     bset.b    #b_keyoff,p_onoff_bit(a5)    *!set key off bit
  5946.     move.l    d4,d1                *!5/10
  5947.     add.w    d0,d1                *!
  5948.     andi.w    #7,d1                *!
  5949.     move.b    opm_kon-work(a6,d1.w),d2    *!
  5950.     and.b    opm_nom-work(a6,d1.w),d2    *!
  5951.     moveq.l    #8,d1                *!
  5952.     jsr    (a1)                *!opmset(強制的にキーオフ)
  5953. @@:                        *!5/10
  5954.     move.l    d0,d1
  5955.     move.l    d0,d6
  5956.     add.w    d6,d6
  5957.     add.w    d6,d6
  5958.     lea    p_note(a5,d6.w),a4
  5959.     move.b    d7,(a4)+        *note number
  5960.     move.b    d3,(a4)+        *velocity
  5961.     move.w    a2,(a4)            *gate time
  5962.     cmpi.w    #TIE_GATE,(a4)
  5963.     bne    @f
  5964.     clr.w    (a4)
  5965. @@:
  5966.     move.b    d7,(a3)+
  5967.     move.b    d3,(a3)+
  5968.     move.w    d1,(a3)+        *note on markerにオフセットをセット
  5969.     clr.l    (a3)+
  5970.     st.b    (a3)            *end code
  5971.     btst.b    #b_split_mode,p_md_flg(a5)
  5972.     beq    @f
  5973.     bsr    do_timbre_split_fm
  5974.     bra    go_cpfm
  5975. @@:
  5976.     move.l    (a6),a4
  5977.     move.w    -(a4),d0        *d0.w=現在実行中のトラックナンバー(0~)
  5978.     lea    fm_tone_set-work(a6),a4
  5979.     bset.b    d1,p_tone_set(a5)    *音色が設定されていないチャンネルに付いて設定する
  5980.     beq    2f
  5981.     add.w    d1,d4            *トラック次元では設定済み
  5982.     andi.w    #$07,d4
  5983.     move.w    d4,d1
  5984.     add.w    d1,d1
  5985.     cmp.w    (a4,d1.w),d0        *同じトラックが音色を設定しているので無視
  5986.     beq    1f
  5987.     move.w    d0,(a4,d1.w)
  5988.     move.b    d4,p_timbre_src(a5)
  5989.     move.w    p_pgm(a5),d0
  5990.     moveq.l    #0,d1
  5991.     move.b    p_bank_msb(a5),d5
  5992.     bmi    @f
  5993.     move.b    d5,d1
  5994.     andi.w    #$7f,d0            *バンクモードならばpgm=0-127
  5995. @@:
  5996.     lsl.w    #7,d1
  5997.     moveq.l    #0,d2
  5998.     move.b    p_bank_lsb(a5),d5
  5999.     bmi    @f
  6000.     move.b    d5,d2
  6001.     andi.w    #$7f,d0            *バンクモードならばpgm=0-127
  6002. @@:
  6003.     or.b    d2,d1
  6004.     lsl.w    #7,d1
  6005.     add.w    d1,d0            *バンク考慮
  6006.     bsr    fmvset
  6007. 1:
  6008.     move.w    p_ch(a5),d4
  6009.     bra    go_cpfm
  6010. 2:                    *トラック次元で未設定
  6011.     add.w    d4,d1            *トラック次元では設定済み
  6012.     andi.w    #$07,d1
  6013.     move.w    d1,d5
  6014.     add.w    d5,d5
  6015.     move.w    d0,(a4,d5.w)
  6016.     moveq.l    #0,d5
  6017.     move.b    p_timbre_src(a5),d5
  6018.     bsr    copy_opm_timbre
  6019. go_cpfm:
  6020.     * > d1.w=step time
  6021.     * - d3.w (velocity)保存する
  6022.     * - d4.l (ch)保存する
  6023.     * X d0 d1 d2 d5 d6 / a1 a2 a4
  6024. *    tst.w    p_level_param(a5)        *AMOD/AFTC ON?
  6025. *    bne    @f                *yes(音量設定不要)
  6026.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6027.     or.w    #$0100,p_level_param(a5)    *!5/28
  6028. @@:
  6029.     tst.w    p_pitch_param(a5)        *AMOD/PORT/BEND ON?
  6030.     bne    @f                *yes(音程設定不要)
  6031.     move.w    #8,p_pitch_param(a5)
  6032. @@:
  6033.     move.w    (a5),d5            *get step & check step
  6034.     beq    next_cmd_fm
  6035.     bsr    fm_bend            *ベンドパラメータ
  6036.     bra    calc_param_fm
  6037.  
  6038. case_slur_fm:                *タイで単音指定のケース
  6039.     * < a4=スラーと判断されたp_noteX+4のアドレス
  6040.     * x d0,d5,a4
  6041.     move.w    (a5),d5
  6042.     tst.b    p_bend_sw(a5)
  6043.     ble    @f
  6044.     bsr    fm_bend
  6045. @@:
  6046.     bsr    tie_calc_param_fm
  6047.     move.w    d2,-(a4)        *set gate
  6048.     cmpi.w    #TIE_GATE,d2
  6049.     bne    @f
  6050.     clr.w    (a4)            *内部TIE_GATE=0(ただしまだd2.w=TIE_GATE)
  6051. @@:
  6052.     cmp.b    -(a4),d3
  6053.     beq    1f
  6054.     move.b    d3,(a4)            *ベロシティが違うなら新設定
  6055. *    tst.w    p_level_param(a5)
  6056. *    bne    1f
  6057.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6058.     or.w    #$0100,p_level_param(a5)    *!5/28
  6059. 1:
  6060.     move.b    d7,-(a4)        *set note
  6061.     tst.w    p_pitch_param(a5)
  6062.     bne    @f
  6063.     move.w    #8,p_pitch_param(a5)
  6064. @@:
  6065.     rts
  6066.  
  6067. calc_param_fm:                *特殊コマンドのパラメータ計算
  6068.     bsr    calc_param_fm_aftc_0
  6069.     bsr    calc_param_fm_pmod_0
  6070.     bsr    calc_param_fm_arcc_0
  6071.     bra    calc_param_fm_agogik_0
  6072.  
  6073. same_note_fm:                *同じノートだった
  6074.     * < d0.w=ch N
  6075.     * < d1.l=8(reg)
  6076. *!!!!/97/06/09
  6077.     sub.w    d4,d0
  6078.     addq.w    #1,d0
  6079.     cmp.w    p_voice_rsv(a5),d0
  6080.     bls    @f
  6081.     moveq.l    #0,d0                *始めに戻す
  6082. @@:
  6083.     move.b    d0,p_next_on(a5)    *次回の発音チャンネル
  6084. *!!!!/97/06/09
  6085.     cmp.b    k_velo(a4),d3
  6086.     beq    1f
  6087.     move.b    d3,k_velo(a4)        *ベロシティが違うなら新設定
  6088. *    tst.w    p_level_param(a5)
  6089. *    bne    1f
  6090.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6091.     or.w    #$0100,p_level_param(a5)    *!5/28
  6092. 1:
  6093.     move.w    a2,k_gate_time(a4)    *set gate time
  6094.     cmpi.w    #TIE_GATE,k_gate_time(a4)
  6095.     bne    @f
  6096.     clr.w    k_gate_time(a4)        *内部TIE_GATE
  6097. @@:
  6098.     move.w    (a5),d5
  6099.     beq    next_cmd_fm
  6100.     tst.b    p_bend_sw(a5)
  6101.     ble    @f
  6102.     bsr    fm_bend
  6103. @@:
  6104. *    bra    tie_calc_param_fm
  6105.  
  6106. tie_calc_param_fm:                    *タイ/スラー・ケース
  6107.     * - a4
  6108.     movem.l    d2/d7/a4,-(sp)
  6109.     bsr    tie_calc_param_fm_aftc_0
  6110.     bsr    tie_calc_param_fm_pmod_0
  6111.     bsr    tie_calc_param_fm_arcc_0
  6112.     bsr    tie_calc_param_fm_agogik_0
  6113.     movem.l    (sp)+,d2/d7/a4
  6114.     rts
  6115.  
  6116. portament_md:                *@B0,Xケース
  6117.     bsr    get_port_param
  6118.     * < d7=source note
  6119.     * < d6=destination note
  6120.     andi.l    #$7f,d6            *make it 0-127
  6121.     andi.w    #$7f,d7            *make it 0-127
  6122.     move.b    d6,p_last_note(a5)    *ポルタメントの場合はデスティネーションをここへ
  6123.     moveq.l    #0,d1
  6124.     move.l    d1,p_port_pitch(a5)    *ちゃっかり初期化
  6125.     move.l    d1,p_port_step(a5)    *一応初期化
  6126.     move.w    p_port_cnt(a5),d1
  6127.     beq    case_key_patch_md
  6128.     sub.b    d7,d6
  6129.     bmi    @f
  6130.     swap    d6        *正のケース
  6131.     lsr.l    #16-11,d6    *diff*2048倍
  6132.     divu    #3,d6
  6133.     bvs    1f
  6134.     andi.l    #$ffff,d6
  6135.     cmpi.w    #8191,d6
  6136.     bls    clprpl_md
  6137. 1:
  6138.     move.l    #8191,d6
  6139. clprpl_md:
  6140.     divu    d1,d6        *d6=range/L d6.w=step counter
  6141.     move.w    d6,d0
  6142.     clr.w    d6
  6143.     divu    d1,d6        *d6=d6/L
  6144.     swap    d0
  6145.     move.w    d6,d0
  6146.     addq.l    #1,d0
  6147.     move.l    d0,p_port_step(a5)
  6148.     bset.b    #b_bend_reset,p_md_flg(a5)        *bend set marker
  6149.     bra    case_key_patch_md
  6150. @@:                *負のケース
  6151.     neg.b    d6
  6152.     swap    d6
  6153.     lsr.l    #16-11,d6    *diff*2048倍
  6154.     divu    #3,d6
  6155.     bvs    1f
  6156.     andi.l    #$ffff,d6
  6157.     cmpi.w    #8192,d6
  6158.     bls    clprmi_md
  6159. 1:
  6160.     move.l    #8192,d6
  6161. clprmi_md:
  6162.     divu    d1,d6        *d6=range/L d6.w=step counter
  6163.     move.w    d6,d0
  6164.     clr.w    d6
  6165.     divu    d1,d6        *d6=d6/L
  6166.     swap    d0
  6167.     move.w    d6,d0
  6168.     neg.l    d0
  6169.     move.l    d0,p_port_step(a5)
  6170.     bset.b    #b_bend_reset,p_md_flg(a5)        *bend set marker
  6171.     bra    case_key_patch_md
  6172.  
  6173. portament2_md:                *@BX,0ケース
  6174.     bsr    get_port_param
  6175.     * < d7=source note
  6176.     * < d6=destination note
  6177.     andi.l    #$7f,d6            *make it 0-127
  6178.     andi.w    #$7f,d7            *make it 0-127
  6179.     move.b    d6,p_last_note(a5)    *ポルタメントの場合はデスティネーションをここへ
  6180.     moveq.l    #0,d1
  6181.     move.l    d1,p_port_pitch(a5)    *ちゃっかり初期化
  6182.     move.l    d1,p_port_step(a5)    *一応初期化
  6183.     sub.b    d7,d6
  6184.     bmi    @f
  6185.     move.b    p_last_note(a5),d7
  6186.     swap    d6        *正のケース
  6187.     lsr.l    #16-11,d6    *diff*2048倍
  6188.     divu    #3,d6
  6189.     bvs    1f
  6190.     andi.l    #$ffff,d6
  6191.     cmpi.w    #8191,d6
  6192.     bls    clpr2pl_md
  6193. 1:
  6194.     move.l    #8191,d6
  6195. clpr2pl_md:
  6196.     sub.w    d6,p_port_pitch(a5)
  6197.     move.w    p_port_cnt(a5),d1
  6198.     beq    case_key_patch_md
  6199.     divu    d1,d6        *d6=range/L d6.w=step counter
  6200.     move.w    d6,d0
  6201.     clr.w    d6
  6202.     divu    d1,d6        *d6=d6/L
  6203.     swap    d0
  6204.     move.w    d6,d0
  6205.     addq.l    #1,d0
  6206.     move.l    d0,p_port_step(a5)
  6207.     bset.b    #b_bend_reset,p_md_flg(a5)        *bend set marker
  6208.     bra    case_key_patch_md
  6209. @@:                *負のケース
  6210.     move.b    p_last_note(a5),d7
  6211.     neg.b    d6
  6212.     swap    d6
  6213.     lsr.l    #16-11,d6    *diff*2048倍
  6214.     divu    #3,d6
  6215.     bvs    1f
  6216.     andi.l    #$ffff,d6
  6217.     cmpi.w    #8192,d6
  6218.     bls    clpr2mi_md
  6219. 1:
  6220.     move.l    #8192,d6
  6221. clpr2mi_md:
  6222.     move.w    d6,p_port_pitch(a5)
  6223.     move.w    p_port_cnt(a5),d1
  6224.     beq    case_key_patch_md
  6225.     divu    d1,d6        *d6=range/L d6.w=step counter
  6226.     move.w    d6,d0
  6227.     clr.w    d6
  6228.     divu    d1,d6        *d6=d6/L
  6229.     swap    d0
  6230.     move.w    d6,d0
  6231.     neg.l    d0
  6232.     move.l    d0,p_port_step(a5)
  6233.     bset.b    #b_bend_reset,p_md_flg(a5)        *bend set marker
  6234.     bra    case_key_patch_md
  6235.  
  6236. calc_autoport_param_md    macro
  6237.     * < d1.w=step
  6238.     * < d7.w=key
  6239.     * x d0,d1,d5,d6
  6240.     moveq.l    #0,d5
  6241.     move.l    d5,p_port_pitch(a5)    *ちゃっかり初期化
  6242.     move.l    d5,p_port_step(a5)    *一応初期化
  6243.     move.b    p_last_note(a5),d0
  6244.     bmi    exit_capm
  6245.     move.b    d7,p_last_note(a5)
  6246.     move.w    p_port2_dly(a5),d5    *auto portament interval
  6247.     move.w    d5,p_port_dly(a5)
  6248.     sub.w    d5,d1
  6249.     bls    exit_capm
  6250.     move.w    p_port2_cnt(a5),d6
  6251.     beq    1f
  6252.     bpl    @f
  6253.     add.w    d6,d1
  6254.     bgt    1f
  6255.     sub.w    d6,d1
  6256.     bra    1f
  6257. @@:
  6258.     cmp.w    d1,d6
  6259.     bcc    1f
  6260.     move.l    d6,d1
  6261. 1:
  6262.     move.w    d1,p_port_cnt(a5)
  6263.     move.l    d7,d6
  6264.     move.b    d0,d7
  6265.     sub.b    d0,d6
  6266.     bpl    2f
  6267.     neg.b    d6        *負のケース
  6268.     swap    d6
  6269.     lsr.l    #16-11,d6    *diff*2048倍
  6270.     divu    #3,d6
  6271.     bvs    1f
  6272.     andi.l    #$ffff,d6
  6273.     cmpi.w    #8192,d6
  6274.     bls    clprmi_md
  6275. 1:
  6276.     move.l    #8192,d6
  6277.     bra    clprmi_md
  6278. 2:                *正のケース
  6279.     swap    d6
  6280.     lsr.l    #16-11,d6    *diff*2048倍
  6281.     divu    #3,d6
  6282.     bvs    1f
  6283.     andi.l    #$ffff,d6
  6284.     cmpi.w    #8191,d6
  6285.     bls    clprpl_md
  6286. 1:
  6287.     move.l    #8191,d6
  6288.     bra    clprpl_md
  6289. exit_capm:
  6290.     endm
  6291.  
  6292. case_key_md:                *音符データ処理(MIDI)
  6293.     * < d7.b=key code
  6294.     bsr    get_st_gt_vl
  6295.     move.b    p_port2_flg(a5),p_port_flg(a5)    *オートポルタメントチェック/ポルタメントフラグ初期化
  6296.     beq    ckm0
  6297.     calc_autoport_param_md
  6298. ckm0:
  6299.     btst.b    #b_tie_mode,p_md_flg(a5)    *!
  6300.     beq    case_key_patch_md        *!
  6301.     clr.l    p_port_pitch(a5)
  6302.     move.b    d7,p_last_note(a5)    *前回のノートを保存
  6303. case_key_patch_md:
  6304.     bsr    do_transpose
  6305.     lea    p_note(a5),a1
  6306.     move.l    p_midi_trans(a5),a2
  6307.     moveq.l    #max_note_on-1,d5
  6308.     tst.w    d2
  6309.     beq    key_off_phase_md
  6310.     tst.b    p_track_mode(a5)
  6311.     bmi    do_note_on_md        *キーオフなし
  6312.     tst.w    (a5)
  6313.     bne    off_tient_md
  6314. 1:                    *以下ステップタイム=0のケース
  6315.     move.b    (a1),d1
  6316.     bmi    do_note_on_md
  6317.     cmp.b    d1,d7
  6318.     beq    same_note_md            *同じノートナンバーを発見
  6319.     move.w    k_gate_time(a1),d0        *絶対音長0音符からのタイか
  6320.     addq.w    #1,d0            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a1))
  6321.     bne    2f
  6322.     moveq.l    #$90,d0                *NOTE OFFへ
  6323.     add.b    d4,d0
  6324.     jsr    (a2)                *send cmd
  6325.     move.b    d1,d0
  6326.     jsr    (a2)                *note number
  6327.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6328.     moveq.l    #$00,d0
  6329.     jsr    (a2)                *#0
  6330.     *ノートワーク整列処理
  6331.     move.l    a1,a4
  6332.     move.l    d5,d0
  6333. @@:
  6334.     move.l    k_note_len(a4),(a4)+
  6335.     dbra    d0,@b                *!6/17
  6336. 2:
  6337.     addq.w    #k_note_len,a1
  6338.     dbra    d5,1b
  6339.     bra    do_note_on_md
  6340. key_off_phase_md:            *ゲートタイム=0はノートオフ指定として処理する
  6341.     tst.b    p_track_mode(a5)
  6342.     bmi    go_cpmd
  6343.     moveq.l    #$80,d0
  6344.     add.b    d4,d0
  6345.     jsr    (a2)                *send cmd
  6346.     move.l    d7,d0
  6347.     jsr    (a2)                *note number
  6348.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6349.     move.l    d3,d0
  6350.     jsr    (a2)                *offベロシティ
  6351. kfpmlp00:
  6352.     move.b    (a1),d1
  6353.     bmi    go_cpmd
  6354.     cmp.b    d1,d7
  6355.     bne    1f
  6356. poly_pressure_patch2:            *ポリフォニックプレッシャー無しモードでは(bra ppp0)
  6357.     moveq.l    #$a0,d0            *polyphonic pressure
  6358.     add.b    d4,d0
  6359.     jsr    (a2)
  6360.     move.b    d1,d0
  6361.     jsr    (a2)
  6362.     moveq    #0,d0            *pp=0(reset)
  6363.     jsr    (a2)
  6364. ppp0:
  6365.     *ノートワーク整列処理
  6366.     move.l    a1,a4
  6367.     move.l    d5,d0
  6368. @@:
  6369.     move.l    k_note_len(a4),(a4)+
  6370.     dbra    d0,@b
  6371.     bra    2f
  6372. 1:
  6373.     addq.w    #k_note_len,a1
  6374. 2:
  6375.     dbra    d5,kfpmlp00
  6376.     bra    go_cpmd
  6377. off_tient_md:                    *以下ステップタイム≠0のケース
  6378.     move.b    k_note(a1),d1
  6379.     bmi    do_note_on_md
  6380.     tst.b    k_note_len(a1)            *鳴っているのが単音4(a1)<0ならば
  6381.     bpl    @f                *スラーのケースか調べる
  6382.     btst.b    #b_tie_mode,p_md_flg(a5)    *スペシャルタイモードか
  6383.     beq    @f                *違う
  6384.     cmpi.w    #TIE_GATE_CODE,k_gate_time(a1)    *タイ指定か
  6385.     beq    case_slur_md            *スラー処理へ
  6386. ktm_lp:
  6387.     move.b    k_note(a1),d1            *鳴っている音で同じノートナンバーを発見
  6388.     bmi    do_note_on_md
  6389. @@:
  6390.     cmp.b    d1,d7
  6391.     beq    same_note_md
  6392.     move.w    k_gate_time(a1),d0        *絶対音長0音符からのタイか
  6393.     beq    gtovwm                *ゲートタイム上書き
  6394.     addq.w    #1,d0            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a1))
  6395.     bne    next_ktm
  6396.     moveq.l    #$90,d0                *NOTE OFFへ
  6397.     add.b    d4,d0
  6398.     jsr    (a2)                *send cmd
  6399.     move.b    d1,d0
  6400.     jsr    (a2)                *note number
  6401.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6402.     moveq.l    #$00,d0
  6403.     jsr    (a2)                *#0
  6404.     *ノートワーク整列処理
  6405.     move.l    a1,a4
  6406.     move.l    d5,d0
  6407. @@:
  6408.     move.l    k_note_len(a4),(a4)+
  6409.     dbra    d0,@b                *!6/17
  6410.     bra    @f
  6411. gtovwm:                        *c*0&e4のようなケースに対応
  6412.     tst.w    d2
  6413.     bmi    next_ktm
  6414.     move.w    d2,k_gate_time(a1)
  6415. next_ktm:
  6416.     addq.l    #k_note_len,a1
  6417. @@:
  6418.     dbra    d5,ktm_lp
  6419. do_note_on_md:                *実際のノートオン処理
  6420.     * < a1.l=ノート情報を格納すべきアドレス
  6421.     tst.b    p_port_flg(a5)        *!3/20
  6422.     bne    @f            *!3/20
  6423.     clr.l    p_port_pitch(a5)    *!3/20
  6424. @@:
  6425.     tst.b    k_note_len*(max_note_on-1)+p_note(a5)
  6426.     bpl    force_noteon_md        *強制的にキーオンする
  6427.     move.b    d7,(a1)+        *note number
  6428.     move.b    d3,(a1)+        *velocity
  6429.     move.w    d2,(a1)            *gate time
  6430.     cmpi.w    #TIE_GATE,d2
  6431.     bne    set_ntonmk_md
  6432.     clr.w    (a1)
  6433. set_ntonmk_md:
  6434.     move.b    d7,(a3)+        *note on markerにノート番号をセット
  6435.     move.b    d3,(a3)+        *note on markerにベロシティをセット
  6436.     clr.w    (a3)+            *dummy
  6437.     moveq.l    #-1,d1
  6438.     move.b    p_timbre_set(a5),d0
  6439.     bpl    @f
  6440.     move.w    p_bank_msb(a5),d1
  6441.     swap    d1
  6442. @@:
  6443.     add.b    d0,d0            *d6 of p_timbre_set:programチェンジが行われたか(MIDI)
  6444.     bpl    @f
  6445.     move.w    p_pgm(a5),d1
  6446. @@:
  6447.     btst.b    #b_split_mode,p_md_flg(a5)
  6448.     beq    @f
  6449.     bsr    do_timbre_split_md
  6450. @@:
  6451.     move.l    d1,(a3)+
  6452.     st.b    (a3)            *end code
  6453.     andi.b    #%0011_1111,p_timbre_set(a5)    *pts_bank,pts_program=0
  6454. note_on_md:
  6455.     * > d1.w=step time
  6456.     * - d3.w (velocity)保存する
  6457.     * - d4.l (ch)保存する
  6458.     * X d0 d1 d2 d5 d6 / a1 a2 a4
  6459.     clr.w    p_special_tie(a5)
  6460. go_cpmd:
  6461.     tst.w    p_pitch_param(a5)
  6462.     bne    @f
  6463.     bclr.b    #b_bend_reset,p_md_flg(a5)
  6464.     beq    @f
  6465.     move.w    #8,p_pitch_param(a5)
  6466. @@:
  6467.     move.w    (a5),d5            *get step & check step
  6468.     beq    next_cmd_md
  6469.     bsr    midi_bend        *ベンドパラメータ
  6470.     bra    calc_param_md
  6471.  
  6472. case_slur_md:
  6473.     * < d4.l=type,ch
  6474.     * < d5.w=max_note_on-1
  6475.     * < a1=p_note
  6476.                     *スラーのケース
  6477.     moveq.l    #0,d1
  6478.     move.b    (a1),d1            *d1.l=note
  6479. poly_pressure_patch0:            *ポリフォニックプレッシャー無しモードでは(bra csm0)
  6480.     cmp.b    k_velo(a1),d3
  6481.     beq    csm0
  6482.     moveq.l    #$a0,d0            *polyphonic pressure
  6483.     add.b    d4,d0
  6484.     jsr    (a2)
  6485.     move.b    d1,d0
  6486.     jsr    (a2)
  6487.     move.b    d3,d0            *velocity
  6488.     jsr    (a2)
  6489. csm0:
  6490.     move.b    d3,k_velo(a1)        *set velocity
  6491.     move.w    d2,k_gate_time(a1)    *set gate
  6492.     cmpi.w    #TIE_GATE,d2
  6493.     bne    @f
  6494.     clr.w    k_gate_time(a1)        *内部TIE_GATE
  6495. @@:
  6496.     sub.l    d1,d7
  6497.     moveq.l    #11,d0
  6498.     asl.l    d0,d7            *8192*diff.
  6499.     divs    #3,d7
  6500.     move.w    d7,p_special_tie(a5)
  6501.     move.w    (a5),d5            *get step
  6502.     tst.b    p_bend_sw(a5)
  6503.     ble    @f
  6504.     bsr    midi_bend
  6505. @@:
  6506.     bsr    tie_calc_param_md
  6507.     tst.w    p_pitch_param(a5)
  6508.     bne    @f
  6509.     bset.b    #b_bend_reset,p_md_flg(a5)
  6510.     move.w    #8,p_pitch_param(a5)
  6511. @@:
  6512.     rts
  6513.  
  6514. calc_param_md:                *特殊コマンドのパラメータ計算
  6515.     bsr    calc_param_md_aftc_0
  6516.     bsr    calc_param_md_pmod_0
  6517.     bsr    calc_param_md_arcc_0
  6518.     bra    calc_param_md_agogik_0
  6519.  
  6520. same_note_md:                *同じノートだった
  6521.     * < a1.l=同じノートのp_note+Xワークアドレス
  6522. poly_pressure_patch1:            *ポリフォニックプレッシャー無しモードでは(bra psp0)
  6523.     cmp.b    k_velo(a1),d3
  6524.     beq    psp0
  6525.     moveq.l    #$a0,d0            *polyphonic pressure
  6526.     add.b    d4,d0
  6527.     jsr    (a2)
  6528.     move.b    d7,d0
  6529.     jsr    (a2)
  6530.     move.b    d3,d0            *velocity
  6531.     jsr    (a2)
  6532. psp0:
  6533.     move.b    d3,k_velo(a1)        *set velocity
  6534.     move.w    d2,k_gate_time(a1)
  6535.     cmpi.w    #TIE_GATE,d2
  6536.     bne    @f
  6537.     clr.w    k_gate_time(a1)        *内部TIE_GATE
  6538. @@:
  6539.     move.w    (a5),d5            *get step
  6540.     beq    next_cmd_md
  6541.     tst.b    p_bend_sw(a5)
  6542.     ble    @f
  6543.     bsr    midi_bend
  6544. @@:
  6545. *    bra    tie_calc_param_md
  6546.  
  6547. tie_calc_param_md:
  6548.     bsr    tie_calc_param_md_aftc_0
  6549.     bsr    tie_calc_param_md_pmod_0
  6550.     bsr    tie_calc_param_md_arcc_0
  6551.     bra    tie_calc_param_md_agogik_0
  6552.  
  6553. force_noteon_md:            *強制的にキーオン
  6554.     moveq.l    #max_note_on-1-1,d5    *1回少なくする
  6555.     lea    p_note(a5),a1
  6556.     moveq.l    #$90,d0            *いちばん古い音を強制的にキーオフ
  6557.     add.b    d4,d0
  6558.     jsr    (a2)            *send cmd
  6559.     move.b    (a1),d0
  6560.     jsr    (a2)            *note number
  6561.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6562.     moveq.l    #$00,d0
  6563.     jsr    (a2)            *#0
  6564. @@:
  6565.     move.l    k_note_len(a1),(a1)+    *詰める処理
  6566.     dbmi    d5,@b
  6567.     move.b    d7,(a1)+        *note number
  6568.     move.b    d3,(a1)+        *velocity
  6569.     move.w    d2,(a1)            *gate time
  6570.     bpl    @f
  6571.     clr.b    (a1)
  6572. @@:
  6573.     move.l    a3,d0
  6574.     lea    p_key_on(a5),a3
  6575.     sub.l    a3,d0
  6576.     cmpi.l    #k_note_len*(max_note_on-1),d0        *次回発音ノートワークが足りてるか
  6577.     bls    set_ntonmk_md        *足りてる
  6578.     moveq.l    #(max_note_on-1)*2-1,d5
  6579. @@:                    *詰める処理
  6580.     move.l    8(a3),(a3)+
  6581.     dbra    d5,@b
  6582.     bra    set_ntonmk_md
  6583.  
  6584. portament_ad:
  6585. portament2_ad:
  6586.     bsr    get_port_param
  6587.     bsr    calc_port_param
  6588.     bra    case_key_patch_ad
  6589.  
  6590. case_key_ad:                *音符データ処理(AD)
  6591.     * < d7.b=key code
  6592.     bsr    get_st_gt_vl
  6593.     move.b    p_port2_flg(a5),p_port_flg(a5)    *オートポルタメントチェック/ポルタメントフラグ初期化
  6594.     beq    cka
  6595.     calc_autoport_param    ad
  6596. cka:
  6597.     clr.l    p_port_pitch(a5)
  6598.     move.b    d7,p_last_note(a5)    *前回のノートを保存
  6599. case_key_patch_ad:
  6600.     bsr    do_transpose
  6601.     lea    p_note(a5),a4
  6602.     tst.w    d2
  6603.     beq    key_off_phase_ad
  6604.     move.b    p_how_many(a5),d6
  6605.     bmi    do_note_on_ad        *現在なにも鳴っていないなら即発音
  6606. *    tst.b    p_track_mode(a5)    *!5/10
  6607. *    bmi    do_note_on_ad        *!5/10
  6608.     move.w    p_voice_rsv(a5),d5
  6609.     tst.w    (a5)
  6610.     bne    off_tient_ad        *和音の時なら最後の音の場合step=nz
  6611.     move.w    d4,d6
  6612. 1:                    *以下ステップタイム=0のケース
  6613.     move.b    k_note(a4),d1
  6614.     bmi    @f
  6615.     cmp.b    d1,d7
  6616.     beq    same_note_ad        *同じノートナンバーを発見
  6617.     move.w    k_gate_time(a4),d0    *絶対音長0音符からのタイがあるか
  6618.     addq.w    #1,d0            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a4))
  6619.     bne    @f
  6620.     move.w    d6,d0
  6621.     bsr    pcm_key_off
  6622.     tas.b    (a4)                *set note off mark
  6623.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6624.     subq.b    #1,p_how_many(a5)        *!6/17
  6625. @@:
  6626.     addq.w    #k_note_len,a4
  6627.     addq.w    #1,d6
  6628.     andi.b    #$0f,d6
  6629.     dbra    d5,1b
  6630.     bra    do_note_on_ad
  6631. key_off_phase_ad:            *ゲートタイム=0はノートオフ指定として処理する
  6632.     tst.b    p_track_mode(a5)
  6633.     bmi    go_cpad
  6634.     move.w    p_voice_rsv(a5),d5
  6635.     move.w    d4,d6
  6636. kfpalp00:
  6637.     cmp.b    k_note(a4),d7
  6638.     bne    @f
  6639.     move.w    d6,d0
  6640.     bsr    pcm_key_off
  6641.     tas.b    (a4)            *set note off mark
  6642.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6643.     subq.b    #1,p_how_many(a5)
  6644. @@:
  6645.     addq.w    #k_note_len,a4
  6646.     addq.w    #1,d6
  6647.     andi.b    #$0f,d6
  6648.     dbra    d5,kfpalp00
  6649.     bra    go_cpad
  6650. off_tient_ad:                *タイの音符をすべてキーオフする
  6651.     btst.b    #b_vtune_mode,p_md_flg(a5)
  6652.     beq    1f            *vtune modeではない
  6653.     tst.b    d6            *d6=0:鳴っているのが単音
  6654.     bne    1f            *(鳴っているのが単音)スラーのケースか調べる
  6655. csa_lp:
  6656.     move.l    (a4)+,d0
  6657.     bmi    @f
  6658.     addq.w    #1,d0            *タイ指定か(cmpi.w #TIE_GATE_CODE,d0)
  6659.     beq    case_slur_ad        *case:slur
  6660. @@:
  6661.     dbra    d5,csa_lp
  6662.     lea    p_note(a5),a4        *破壊してしまっているから再設定
  6663.     move.w    p_voice_rsv(a5),d5
  6664. 1:
  6665.     move.w    d4,d6
  6666. kta_lp:
  6667.     move.b    k_note(a4),d1
  6668.     bmi    next_kta
  6669.     cmp.b    d1,d7            *鳴っている音で同じノートナンバーを発見
  6670.     beq    same_note_ad
  6671.     move.w    k_gate_time(a4),d0    *絶対音長0音符からのタイがあるか
  6672.     beq    gtovwa
  6673.     addq.w    #1,d0            *タイ指定か(=cmpi.w #TIE_GATE_CODE,k_gate_time(a4))
  6674.     bne    next_kta
  6675.     move.w    d6,d0
  6676.     bsr    pcm_key_off
  6677.     tas.b    (a4)                *set note off mark
  6678.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6679.     subq.b    #1,p_how_many(a5)        *!6/17
  6680.     bra    next_kta
  6681. gtovwa:
  6682.     tst.w    d2
  6683.     bmi    next_kta
  6684.     move.w    d2,k_gate_time(a4)
  6685. next_kta:
  6686.     addq.w    #k_note_len,a4
  6687.     addq.w    #1,d6
  6688.     andi.b    #$0f,d6
  6689.     dbra    d5,kta_lp
  6690. do_note_on_ad:                *実際のノートオン処理
  6691.     move.w    p_voice_rsv(a5),d5
  6692.     move.b    p_how_many(a5),d1
  6693.     addq.b    #1,d1
  6694.     cmp.b    d5,d1
  6695.     bls    1f
  6696.     btst.b    #b_voice_rsv,p_md_flg(a5)
  6697.     bne    2f
  6698.     cmpi.w    #adpcm_ch_max-1,d5
  6699.     beq    2f
  6700.     lea    p_note(a5),a4
  6701.     moveq.l    #0,d0
  6702. @@:                    *DVA OPERATION
  6703.     tst.l    (a4)+
  6704.     bmi    3f
  6705.     addq.w    #1,d0
  6706.     dbra    d5,@b
  6707.     move.w    p_voice_rsv(a5),d5
  6708.     addq.w    #1,d5
  6709.     move.w    d5,p_voice_rsv(a5)
  6710. 1:
  6711.     move.b    d1,p_how_many(a5)
  6712. 2:
  6713.     moveq.l    #0,d0
  6714.     move.b    p_next_on(a5),d0
  6715.     cmp.b    d5,d0
  6716.     bls    @f
  6717.     moveq.l    #0,d0
  6718. @@:
  6719.     move.l    d0,d6
  6720.     addq.w    #1,d6
  6721.     move.b    d6,p_next_on(a5)
  6722. 3:
  6723.     move.l    d0,d6                *!save to d6
  6724.     tst.b    p_track_mode(a5)        *!ダンパーなどの時は発音前にキーオフ
  6725.     bpl    @f                *!
  6726.     bset.b    #b_keyoff,p_onoff_bit(a5)    *!set key off bit
  6727.     add.w    d4,d0                *!
  6728.     andi.w    #$0f,d0                *!
  6729.     bsr    pcm_key_off            *!
  6730. @@:                        *!5/10
  6731.     move.l    d6,d1
  6732.     add.w    d6,d6
  6733.     add.w    d6,d6
  6734.     lea    p_note(a5,d6.w),a4
  6735.     move.b    d7,(a4)+        *note number
  6736.     move.b    d3,(a4)+        *velocity
  6737.     move.w    d2,(a4)            *gate time
  6738.     cmpi.w    #TIE_GATE,d2
  6739.     bne    set_ntonmk_ad
  6740.     clr.w    (a4)
  6741. set_ntonmk_ad:
  6742.     move.b    d7,(a3)+        *note number
  6743.     move.b    d3,(a3)+        *velocity
  6744.     move.w    d1,(a3)+        *note on markerにオフセットをセット
  6745.     move.l    p_bank_msb(a5),d1    *d1.l=bank.hw,timbre.lw
  6746. @@:
  6747.     btst.b    #b_split_mode,p_md_flg(a5)
  6748.     beq    @f
  6749.     bsr    do_timbre_split_ad
  6750. @@:                    *d1.l=p_bank_msb.w,p_pgmをADPCM音色番号実行値に変換
  6751.     moveq.l    #0,d2
  6752.     move.w    d1,d2            *d2=pgm
  6753.     btst.b    #b_vtune_mode,p_md_flg(a5)
  6754.     beq    @f
  6755.     swap    d1
  6756.     move.w    d1,d0            *check bank_msb
  6757.     bmi    @f
  6758.     tst.b    d0            *check bank_lsb
  6759.     bmi    @f
  6760.     andi.w    #$00_7f,d2        *バンクモードの時にはpgm=0-127
  6761.     andi.w    #$00_7f,d1        *bank lsb
  6762.     andi.w    #$7f_00,d0        *bank msb
  6763.     lsr.w    #1,d0            *127倍
  6764.     or.w    d0,d1
  6765.     lsl.w    #7,d1
  6766.     add.w    d1,d2            *d2=(bank_msb*128+bank_lsb)*128+pgm
  6767. @@:
  6768.     move.l    d2,(a3)+
  6769.     st.b    (a3)            *end code
  6770. go_cpad:
  6771.     * > d1.w=step time
  6772.     * - d3.w (velocity)保存する
  6773.     * - d4.l (ch)保存する
  6774.     * X d0 d1 d2 d5 d6 / a1 a2 a4
  6775. *    tst.w    p_level_param(a5)
  6776. *    bne    @f
  6777.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6778.     or.w    #$0100,p_level_param(a5)    *!5/28
  6779. @@:
  6780.     move.w    (a5),d5            *get step & check step
  6781.     beq    next_cmd_ad
  6782.     bsr    fm_bend            *ベンドパラメータ
  6783.     bra    calc_param_ad
  6784.  
  6785. case_slur_ad:
  6786.     * < a4=スラーと判断されたp_noteX+4のアドレス
  6787.     * x d0,d5,a4
  6788.     move.w    (a5),d5
  6789.     tst.b    p_bend_sw(a5)
  6790.     ble    @f
  6791.     bsr    fm_bend
  6792. @@:
  6793.     bsr    tie_calc_param_ad
  6794.     move.w    d2,-(a4)        *set gate
  6795.     cmpi.w    #TIE_GATE,d2
  6796.     bne    @f
  6797.     clr.w    (a4)            *内部TIE_GATE(ただしまだd2.w=TIE_GATE)
  6798. @@:
  6799.     cmp.b    -(a4),d3
  6800.     beq    1f
  6801.     move.b    d3,(a4)            *ベロシティが違うなら新設定
  6802. *    tst.w    p_level_param(a5)
  6803. *    bne    1f
  6804.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6805.     or.w    #$0100,p_level_param(a5)    *!5/28
  6806. 1:
  6807.     move.b    d7,-(a4)        *set note
  6808.     tst.w    p_pitch_param(a5)
  6809.     bne    @f
  6810.     move.w    #8,p_pitch_param(a5)
  6811. @@:
  6812.     rts
  6813.  
  6814. calc_param_ad:                *特殊コマンドのパラメータ計算
  6815.     bsr    calc_param_ad_aftc_0
  6816.     bsr    calc_param_ad_pmod_0
  6817.     bsr    calc_param_ad_arcc_0
  6818.     bra    calc_param_ad_agogik_0
  6819.  
  6820. same_note_ad:                *同じノートだった
  6821.     * < d6.w=ch N
  6822.     cmp.b    k_velo(a4),d3
  6823.     beq    1f
  6824.     move.b    d3,k_velo(a4)        *ベロシティが違うなら新設定
  6825. *    tst.w    p_level_param(a5)
  6826. *    bne    1f
  6827.     andi.w    #$00f0,p_level_param(a5)    *!10/25
  6828.     or.w    #$0100,p_level_param(a5)    *!5/28
  6829. 1:
  6830.     move.w    d2,k_gate_time(a4)    *set gate time
  6831.     cmpi.w    #TIE_GATE,d2
  6832.     bne    @f
  6833.     clr.w    k_gate_time(a4)        *内部TIE_GATE
  6834. @@:
  6835.     move.w    (a5),d5            *check step
  6836.     beq    next_cmd_ad
  6837.     tst.b    p_bend_sw(a5)
  6838.     ble    @f
  6839.     bsr    fm_bend
  6840. @@:
  6841. *    bra    tie_calc_param_ad
  6842.  
  6843. tie_calc_param_ad:
  6844.     movem.l    d2/d7/a4,-(sp)
  6845.     bsr    tie_calc_param_ad_aftc_0
  6846.     bsr    tie_calc_param_ad_pmod_0
  6847.     bsr    tie_calc_param_ad_arcc_0
  6848.     bsr    tie_calc_param_ad_agogik_0
  6849.     movem.l    (sp)+,d2/d7/a4
  6850.     rts
  6851.  
  6852. *force_noteon_ad:            *強制的に次のチャンネルでキーオン
  6853. *    * < d0.b=p_next_on
  6854. *    * < d5.b=p_voice_rsv
  6855. *    * < a4.l=p_note+d0*4
  6856. *    * > d1.l=ptr
  6857. *    move.l    d0,d6            *save d0 into d6
  6858. *    move.l    d0,d1
  6859. *    addq.b    #1,d6
  6860. *    cmp.b    d5,d6
  6861. *    bls    @f
  6862. *    moveq.l    #0,d6            *始めに戻す
  6863. *    lea    p_note(a5),a4
  6864. *@@:
  6865. *    move.b    d6,p_next_on(a5)    *次回の発音チャンネル
  6866. *    bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  6867. *    add.w    d4,d0
  6868. *    andi.w    #$0f,d0
  6869. *    bsr    pcm_key_off
  6870. *    move.b    d7,(a4)+        *note number
  6871. *    move.b    d3,(a4)+        *velocity
  6872. *    move.w    a2,(a4)+        *gate time
  6873. *    move.l    a3,d0
  6874. *    lea    p_key_on(a5),a3
  6875. *    sub.l    a3,d0
  6876. *    cmpi.l    #4*(16-1),d0
  6877. *    bls    set_ntonmk_ad
  6878. *    moveq.l    #(max_note_on-1)*2-1,d5
  6879. *@@:
  6880. *    move.l    8(a3),(a3)+
  6881. *    dbra    d5,@b
  6882. *    bra    set_ntonmk_ad
  6883. *-----------------------------------------------------------------------------
  6884. rest_ad:                *ADPCM/休符
  6885.     bsr    get_st_gt
  6886. rest_patch_ad:
  6887.     bsr    rest_ope
  6888.     move.l    d1,d5            *d1=d5=step
  6889.     beq    next_cmd_ad
  6890.     tst.l    d6
  6891.     bmi    tie_rest_calc_param_ad
  6892.     bsr    calc_param_ad_aftc_1
  6893.     bsr    calc_param_ad_pmod_1
  6894.     bsr    calc_param_ad_arcc_1
  6895.     bra    calc_param_ad_agogik_1
  6896.  
  6897. tie_rest_calc_param_ad:
  6898.     bsr    tie_calc_param_ad_aftc_1
  6899.     bsr    tie_calc_param_ad_pmod_1
  6900.     bsr    tie_calc_param_ad_arcc_1
  6901.     bra    tie_calc_param_ad_agogik_1
  6902.  
  6903. rest_fm:                *FM/休符
  6904.     bsr    get_st_gt
  6905. rest_patch_fm:
  6906.     bsr    rest_ope
  6907.     move.l    d1,d5            *d1=d5=step
  6908.     beq    next_cmd_fm
  6909.     tst.l    d6
  6910.     bmi    tie_rest_calc_param_fm
  6911.     bsr    calc_param_fm_aftc_1
  6912.     bsr    calc_param_fm_pmod_1
  6913.     bsr    calc_param_fm_arcc_1
  6914.     bra    calc_param_fm_agogik_1
  6915.  
  6916. tie_rest_calc_param_fm:
  6917.     bsr    tie_calc_param_fm_aftc_1
  6918.     bsr    tie_calc_param_fm_pmod_1
  6919.     bsr    tie_calc_param_fm_arcc_1
  6920.     bra    tie_calc_param_fm_agogik_1
  6921.  
  6922. rest_ope:
  6923.     moveq.l    #0,d6            *tie or not
  6924.     tst.b    p_how_many(a5)
  6925.     bmi    exit_dr            *case:all off
  6926.     move.w    p_voice_rsv(a5),d0    *loop counter
  6927.     lea    p_note+k_gate_time(a5),a1
  6928. dr_lp_f:
  6929.     move.w    (a1),d5
  6930.     cmpi.w    #MAX_GATE,d5
  6931.     beq    1f
  6932.     cmpi.w    #TIE_GATE_CODE,d5    *check gate time
  6933.     bne    @f
  6934. 1:
  6935.     moveq.l    #-1,d6            *tie mark
  6936.     cmpi.w    #TIE_GATE,d2        *またさらにタイか
  6937.     beq    @f
  6938.     move.w    d2,(a1)            *set gate time
  6939. @@:
  6940.     addq.w    #k_note_len,a1
  6941.     dbra    d0,dr_lp_f
  6942. exit_dr:
  6943.     rts
  6944.  
  6945. rest_md:            *MIDI/休符
  6946.     bsr    timbre_set2
  6947.     bsr    get_st_gt
  6948. rest_patch_md:
  6949.     moveq.l    #0,d6            *tie or not
  6950.     moveq.l    #max_note_on-1,d0    *max note on
  6951.     lea    p_note(a5),a1
  6952. drm_lp0:
  6953.     move.l    (a1)+,d5        *note
  6954.     bmi    exit_rstmd        *exit
  6955.     cmpi.w    #MAX_GATE,d5
  6956.     beq    1f
  6957.     cmpi.w    #TIE_GATE_CODE,d5    *check gate time
  6958.     bne    @f
  6959. 1:
  6960.     moveq.l    #-1,d6            *tie mark
  6961.     cmpi.w    #TIE_GATE,d2        *またさらにタイか
  6962.     beq    @f
  6963.     move.w    d2,-2(a1)        *set gate time
  6964. @@:
  6965.     dbra    d0,drm_lp0
  6966. exit_rstmd:
  6967.     move.l    d1,d5
  6968.     beq    next_cmd_md
  6969.     tst.l    d6
  6970.     bmi    tie_rest_calc_param_md
  6971.     bsr    calc_param_md_aftc_1
  6972.     bsr    calc_param_md_pmod_1
  6973.     bsr    calc_param_md_arcc_1
  6974.     bra    calc_param_md_agogik_1
  6975.  
  6976. tie_rest_calc_param_md:
  6977.     bsr    tie_calc_param_md_aftc_1
  6978.     bsr    tie_calc_param_md_pmod_1
  6979.     bsr    tie_calc_param_md_arcc_1
  6980.     bra    tie_calc_param_md_agogik_1
  6981. *-----------------------------------------------------------------------------
  6982. wait_md:            *ウェイト(MIDI)
  6983.     bsr    timbre_set2
  6984.     bsr    get_steptime
  6985. wait_patch_md:
  6986.     move.w    d1,(a5)
  6987.     rts
  6988.  
  6989. wait_fm:            *ウェイト(FM)
  6990.     bsr    get_steptime
  6991. wait_patch_fm:
  6992.     move.w    d1,(a5)
  6993.     rts
  6994.  
  6995. wait_ad:            *ウェイト(ADPCM)
  6996.     bsr    get_steptime
  6997. wait_patch_ad:
  6998.     move.w    d1,(a5)
  6999.     rts
  7000. *------------------------------------------------------------------------------
  7001. mx_key_md:                *MXDRV-conv用(MIDI)
  7002.     bsr    get_mxkey
  7003.     bra    case_key_patch_md
  7004.  
  7005. mx_key_ad:                *MXDRV-conv用(ADPCM)
  7006.     bsr    get_mxkey
  7007.     bra    case_key_patch_ad
  7008.  
  7009. mx_key_fm:                *MXDRV-conv用(FM)
  7010.     pea    case_key_patch_md(pc)
  7011.  
  7012. get_mxkey:
  7013.     move.b    (a0)+,d7        *get note number
  7014.     bsr    get_steptime
  7015.     move.w    d1,(a5)
  7016.     tst.b    d7
  7017.     bpl    @f            *note<0の場合はvelocityあり
  7018.     andi.w    #$007f,d7        *0-127
  7019.     move.w    #TIE_GATE,d2
  7020.     bra    1f
  7021. @@:
  7022.     bsr    calc_gate
  7023. 1:
  7024.     move.l    a0,-(sp)
  7025.     lea    dummy_velo(pc),a0    *ダミーベロシティにポイントさせる
  7026.     bsr    get_def_velo
  7027.     move.l    (sp)+,a0
  7028.     rts
  7029. dummy_velo:    dc.b    $80
  7030.     .even
  7031.  
  7032. calc_gate:                *ゲートタイムの計算
  7033.     * < d1.w=step time
  7034.     * > d2.w=gate time
  7035.     * - d1
  7036.     move.w    p_Q_gate(a5),d2
  7037.     bmi    @f            *case:@Q
  7038.     mulu    d1,d2
  7039.     beq    1f
  7040.     lsr.l    #8,d2            */256
  7041.     rts
  7042. @@:
  7043.     add.w    d1,d2
  7044.     bgt    exit_cg            *正常なケース
  7045. 1:                    *step-@Q<=0のケース/@Q=0のケース
  7046.     move.w    d1,d2
  7047. exit_cg:
  7048.     rts
  7049. *------------------------------------------------------------------------------
  7050. get_steptime:
  7051.     * > d1.w=steptime
  7052.     moveq.l    #0,d1
  7053.     move.b    (a0)+,d1
  7054.     bpl    @f
  7055.     add.b    d1,d1            *最上位ビット殺す
  7056.     lsl.w    #7,d1
  7057.     move.b    (a0)+,d1
  7058. @@:
  7059.     rts
  7060.  
  7061. get_st_gt:                *ステップ、ゲートの取りだし(休符ケース)
  7062.     * > d1=step
  7063.     * > d2=gate
  7064.     * x d0
  7065.     bsr    do_rest_vseq
  7066.     moveq.l    #0,d1
  7067.     move.b    (a0)+,d1
  7068.     bpl    @f
  7069.     add.b    d1,d1            *最上位ビット殺す
  7070.     lsl.w    #7,d1
  7071.     move.b    (a0)+,d1        *get word step
  7072. @@:
  7073.     move.w    d1,(a5)            *save p_step_time
  7074.     moveq.l    #0,d2
  7075.     move.b    (a0)+,d2
  7076.     bpl    @f            *0~127
  7077.     add.b    d2,d2            *最上位ビット殺す
  7078.     lsl.w    #7,d2
  7079.     move.b    (a0)+,d2        *get word gate
  7080.     tst.w    d2
  7081.     bne    @f
  7082.     move.w    #TIE_GATE,d2
  7083. @@:
  7084. exit_gsg:                *V2互換モードの時はパッチ(NOP)
  7085.     rts
  7086.     cmpi.w    #1,d1
  7087.     bne    @f
  7088.     move.w    #TIE_GATE,d2        *V2コンパチモードの時はstep=1は強制的にタイ
  7089. @@:
  7090.     rts
  7091.  
  7092. get_st_gt_vl:                *ステップ、ゲート、ベロシティの取りだし
  7093.     * > d1.l=step
  7094.     * > d2.l=gate
  7095.     * > d3.l=velocity param.(最上位bitが1の場合はデフォルト指定だった事を意味する)
  7096.     * x d0,d5
  7097.     moveq.l    #0,d1            *get step
  7098.     move.b    (a0)+,d1
  7099.     bpl    @f
  7100.     add.b    d1,d1            *最上位ビット殺す
  7101.     lsl.w    #7,d1
  7102.     move.b    (a0)+,d1        *get word step
  7103. @@:
  7104.     move.w    d1,(a5)            *save p_step_time
  7105.  
  7106.     moveq.l    #0,d2            *get gate
  7107.     move.b    (a0)+,d2
  7108.     bpl    @f            *0~127
  7109.     add.b    d2,d2            *最上位ビット殺す
  7110.     lsl.w    #7,d2
  7111.     move.b    (a0)+,d2        *get word gate
  7112.     tst.w    d2
  7113.     bne    @f
  7114.     move.w    #TIE_GATE,d2
  7115. @@:
  7116. get_def_velo:                *ベロシティ取りだし部
  7117.     bra.s    @f            *V2互換モードの時はパッチ(NOP)
  7118.     cmpi.w    #1,d1
  7119.     bne    @f
  7120.     move.w    #TIE_GATE,d2        *V2コンパチモードの時はstep=1は強制的にタイ
  7121. @@:
  7122.     moveq.l    #0,d5
  7123.     move.b    p_velo(a5),d5
  7124. *aftc_on?:                *アフタータッチシーケンス?
  7125.     tst.b    p_aftc_sw(a5)
  7126.     beq    vseq_on?
  7127.     tst.w    p_aftc_1st_dly(a5)    *始めにディレイがある時はdefault velocity
  7128.     bne    vseq_on?
  7129.     btst.b    #0,p_aftc_omt(a5)
  7130.     beq    vseq_on?
  7131.     tst.l    d4            *MIDIの場合はベロシティでノートオンするから
  7132.     bpl    2f            *aftertouchはaftertouchとして出力する
  7133.                     *MIDIケース
  7134.     btst.b    #0,p_aftc_rltv(a5)
  7135.     beq    1f
  7136.     move.b    p_aftc_tbl(a5),d0
  7137.     bpl    @f
  7138.     add.b    d0,p_aftc_level(a5)
  7139.     bpl    vseq_on?
  7140.     clr.b    p_aftc_level(a5)
  7141.     bra    vseq_on?
  7142. @@:
  7143.     add.b    d0,p_aftc_level(a5)
  7144.     bpl    vseq_on?
  7145.     move.b    #127,p_aftc_level(a5)
  7146.     bra    vseq_on?
  7147. 1:
  7148.     move.b    p_aftc_tbl(a5),p_aftc_level(a5)
  7149.     bra    vseq_on?
  7150. 2:                    *内蔵音源ケース
  7151.     btst.b    #0,p_aftc_rltv(a5)
  7152.     beq    @f
  7153.     moveq.l    #0,d0
  7154.     move.b    p_aftc_tbl(a5),d0
  7155.     ori.w    #$8000,d0
  7156.     swap    d0            *相対マーク
  7157.     or.l    d0,d5            *d5.hwに相対値を持っていっておく
  7158.     bra    vseq_on?
  7159. @@:
  7160.     move.b    p_aftc_tbl(a5),d5
  7161. vseq_on?:                *エンハンスド・ベロシティ・シーケンス?
  7162.     bsr    do_vseq
  7163. get_velo:
  7164.     moveq.l    #0,d3
  7165.     move.b    (a0)+,d3
  7166.     bpl    1f            *直接指定のケース
  7167.     cmpi.b    #128,d3
  7168.     beq    @f            *デフォルト選択の場合
  7169.     sub.b    #192,d3            *相対ケース
  7170.     ext.w    d3
  7171.     add.w    d5,d3
  7172.     bra    2f
  7173. @@:
  7174.     move.w    d5,d3
  7175. 2:
  7176.     bset.l    #31,d3            *デフォルト選択/相対指定であるマーク
  7177.     reduce_vol    d3
  7178. 1:
  7179.     tst.l    d4            *MIDI?
  7180.     bmi    2f
  7181.     tst.l    d5
  7182.     bpl    1f
  7183.     swap    d5
  7184.     tst.b    d5
  7185.     bpl    @f
  7186.     add.b    d5,d3
  7187.     bpl    1f
  7188.     clr.b    d3
  7189.     bra    1f
  7190. @@:
  7191.     add.b    d5,d3
  7192.     bpl    1f
  7193.     move.b    #127,d3            *わざと.b
  7194. 1:
  7195.     move.b    d3,p_aftc_level(a5)    *便宜上セット
  7196. 2:
  7197.     rts
  7198.  
  7199. do_rest_vseq:
  7200.     tst.b    p_vseq_param+p_arcc_sw(a5)
  7201.     beq    exit_do_vseq
  7202.     lea    p_vseq_param(a5),a4        *エンハンスド・ベロシティ・シーケンス処理
  7203.     btst.b    #b_arcc_rstsync,p_arcc_flg(a4)    *休符の時も進行?
  7204.     bne    @f
  7205.     bra    exit_do_vseq
  7206. do_vseq:
  7207.     tst.b    p_vseq_param+p_arcc_sw(a5)
  7208.     beq    exit_do_vseq
  7209.     lea    p_vseq_param(a5),a4        *エンハンスド・ベロシティ・シーケンス処理
  7210.     btst.b    #b_vseq_gvnsync,p_arcc_flg(a4)    *ベロシティが与えられている時も進行?
  7211.     bne    @f
  7212.     tst.b    (a0)                *plusなら直値指定なので無視
  7213.     bpl    exit_do_vseq
  7214. @@:
  7215.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7216.     bne    vsqop_2nd        *2回目以降の場合は別処理
  7217.                     *以下、初めての場合
  7218.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7219.     move.b    #2,p_arcc_chain(a4)    *即接続(つまり同期)    3/15
  7220. *!3/15    move.b    #1,p_arcc_chain(a4)    *接続待機
  7221. *!    tst.b    p_arcc_dpt_now(a4)
  7222. *!    bne    @f
  7223. *!    addq.b    #1,p_arcc_chain(a4)    *即接続(つまり同期)
  7224. *!@@:
  7225.     movem.l    d1-d2/d5,-(sp)
  7226.     moveq.l    #0,d5            *!dummy
  7227.     moveq.l    #0,d6            *!dummy
  7228.     bsr    fm_arcc
  7229.     movem.l    (sp)+,d1-d2/d5
  7230.     bra    1f
  7231. vsqop_2nd:                *2回目以降
  7232.     subq.w    #1,p_arcc_syncnt2(a4)
  7233.     bne    exit_do_vseq
  7234.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7235.     tas.b    p_trk_seq_flg(a5)    *b_vseq_done
  7236.     bmi    1f            *一度やったら更新しない
  7237.     movem.l    d1-d2/a0,-(sp)
  7238.     addq.w    #1,a0            *便宜上
  7239.     bsr    vseq_entry
  7240.     movem.l    (sp)+,d1-d2/a0
  7241. 1:
  7242.     move.b    p_arcc_level(a4),d0
  7243.     ext.w    d0
  7244.     move.w    #0,d5            *わざとd5.w
  7245.     move.b    p_arcc_origin(a4),d5    *SPECIAL ENHANCED VELOCITY SEQUENCEの場合
  7246.     btst.b    #b_arcc_phase,p_arcc_flg2(a4)
  7247.     beq    @f
  7248.     sub.w    d0,d5
  7249.     bra    1f
  7250. @@:
  7251.     add.w    d0,d5
  7252. 1:
  7253. exit_do_vseq:
  7254.     rts
  7255.  
  7256. calc_param_fm_aftc_0:
  7257. calc_param_ad_aftc_0:
  7258.     tst.b    p_aftc_sw(a5)
  7259.     beq    1f
  7260.     tst.b    p_aftc_flg(a5)
  7261.     bmi    @f
  7262.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7263.     beq    fm_aftc                *not first time
  7264. 1:
  7265.     rts
  7266. @@:
  7267.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7268.     beq    @f
  7269.     subq.w    #1,p_aftc_syncnt2(a5)
  7270.     bne    1b
  7271. @@:
  7272.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7273.     bra    fm_aftc
  7274.  
  7275. calc_param_fm_aftc_1:
  7276. calc_param_ad_aftc_1:
  7277.     tst.b    p_aftc_sw(a5)
  7278.     beq    1f
  7279.     btst.b    #b_aftc_rstsync,p_aftc_flg(a5)
  7280.     bne    @f
  7281.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7282.     beq    fm_aftc                *not first time
  7283. 1:
  7284.     rts
  7285. @@:
  7286.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7287.     beq    @f
  7288.     subq.w    #1,p_aftc_syncnt2(a5)
  7289.     bne    1b
  7290. @@:
  7291.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7292.     bra    fm_aftc            *アフタータッチパラメータ
  7293.  
  7294. calc_param_fm_pmod_0:
  7295. calc_param_ad_pmod_0:
  7296.     tst.b    p_pmod_sw(a5)
  7297.     beq    1f
  7298.     tst.b    p_pmod_flg(a5)        *(b_pmod_sync)
  7299.     bmi    @f
  7300.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7301.     beq    2f                *not first time
  7302. 1:
  7303.     rts
  7304. @@:
  7305.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7306.     beq    2f
  7307.     subq.w    #1,p_pmod_syncnt2(a5)
  7308.     bne    1b
  7309. 2:
  7310.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7311.     move.b    #2,p_pmod_chain(a5)    *即接続(つまり同期)
  7312.     moveq.l    #4,d6
  7313.     bra    fm_pmod            *モジュレーションパラメータ
  7314.  
  7315. calc_param_fm_pmod_1:                *rest case
  7316. calc_param_ad_pmod_1:                *rest case
  7317.     tst.b    p_pmod_sw(a5)
  7318.     beq    1f
  7319.     btst.b    #b_pmod_rstsync,p_pmod_flg(a5)
  7320.     bne    @f
  7321. *!3/26    bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7322. *!3/26    beq    2f                *not first time
  7323. 1:
  7324.     rts
  7325. @@:
  7326.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7327.     beq    2f
  7328.     subq.w    #1,p_pmod_syncnt2(a5)
  7329.     bne    1b
  7330. 2:
  7331.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7332.     move.b    #2,p_pmod_chain(a5)    *即接続(つまり同期)
  7333.     moveq.l    #4,d6
  7334.     bra    fm_pmod            *モジュレーションパラメータ
  7335.  
  7336. calc_param_fm_arcc_0:
  7337. calc_param_ad_arcc_0:
  7338.     move.w    #$0080,d6
  7339.     moveq.l    #arcc_max-1,d7
  7340.     lea    p_arcc_param(a5),a4
  7341. @@:
  7342.     tst.b    p_arcc_sw(a4)
  7343.     beq    3f
  7344.     tst.b    p_arcc_flg(a4)            *(b_arcc_sync)
  7345.     bmi    1f
  7346.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7347.     beq    2f
  7348.     lea    __arcc_len(a4),a4
  7349.     lsr.b    #1,d6
  7350.     dbra    d7,@b
  7351.     rts
  7352. 1:
  7353.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7354.     beq    2f
  7355.     subq.w    #1,p_arcc_syncnt2(a4)
  7356.     bne    3f
  7357. 2:
  7358.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7359.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7360.     bsr    fm_arcc
  7361. 3:
  7362.     lea    __arcc_len(a4),a4
  7363.     lsr.b    #1,d6
  7364.     dbra    d7,@b
  7365.     rts
  7366.  
  7367. calc_param_fm_arcc_1:
  7368. calc_param_ad_arcc_1:
  7369.     move.w    #$0080,d6
  7370.     moveq.l    #arcc_max-1,d7
  7371.     lea    p_arcc_param(a5),a4
  7372. @@:
  7373.     tst.b    p_arcc_sw(a4)
  7374.     beq    3f
  7375.     btst.b    #b_arcc_rstsync,p_arcc_flg(a4)
  7376.     bne    1f
  7377.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7378.     beq    2f
  7379.     lea    __arcc_len(a4),a4
  7380.     lsr.b    #1,d6
  7381.     dbra    d7,@b
  7382.     rts
  7383. 1:
  7384.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7385.     beq    2f
  7386.     subq.w    #1,p_arcc_syncnt2(a4)
  7387.     bne    3f
  7388. 2:
  7389.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7390.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7391.     bsr    fm_arcc
  7392. 3:
  7393.     lea    __arcc_len(a4),a4
  7394.     lsr.b    #1,d6
  7395.     dbra    d7,@b
  7396.     rts
  7397.  
  7398. calc_param_fm_agogik_0:
  7399. calc_param_ad_agogik_0:
  7400. calc_param_md_agogik_0:
  7401.     btst.b    #b_agogik_trmk,p_agogik_flg(a5)
  7402.     beq    3f
  7403.     move.l    a5,a4
  7404.     lea.l    agogik_base(a6),a5
  7405.     btst.b    #_ID_SE,p_track_stat(a4)
  7406.     beq    @f
  7407.     lea.l    agogik_base_se(a6),a5
  7408. @@:
  7409.     tst.b    p_pmod_sw(a5)
  7410.     beq    2f
  7411.     tst.b    p_agogik_flg(a4)        *b_agogik_sync
  7412.     bmi    @f
  7413.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7414.     beq    1f
  7415.     move.l    a4,a5
  7416.     rts
  7417. @@:
  7418.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7419.     beq    1f
  7420.     subq.w    #1,p_pmod_syncnt2(a5)
  7421.     bne    2f
  7422. 1:
  7423.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7424.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7425.     moveq.l    #0,d6
  7426.     bsr    fm_pmod                *モジュレーションパラメータ
  7427. 2:
  7428.     move.l    a4,a5
  7429. 3:
  7430.     rts
  7431.  
  7432. calc_param_fm_agogik_1:
  7433. calc_param_ad_agogik_1:
  7434. calc_param_md_agogik_1:
  7435.     btst.b    #b_agogik_trmk,p_agogik_flg(a5)
  7436.     beq    3f
  7437.     move.l    a5,a4
  7438.     lea.l    agogik_base(a6),a5
  7439.     btst.b    #_ID_SE,p_track_stat(a4)
  7440.     beq    @f
  7441.     lea.l    agogik_base_se(a6),a5
  7442. @@:
  7443.     tst.b    p_pmod_sw(a5)
  7444.     beq    2f
  7445.     btst.b    #b_agogik_rstsync,p_agogik_flg(a4)
  7446.     bne    @f
  7447.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7448.     beq    1f
  7449.     move.l    a4,a5
  7450.     rts
  7451. @@:
  7452.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7453.     beq    1f
  7454.     subq.w    #1,p_pmod_syncnt2(a5)
  7455.     bne    2f
  7456. 1:
  7457.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7458.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7459.     moveq.l    #0,d6
  7460.     bsr    fm_pmod                *モジュレーションパラメータ
  7461. 2:
  7462.     move.l    a4,a5
  7463. 3:
  7464.     rts
  7465.  
  7466. tie_calc_param_fm_aftc_0:
  7467. tie_calc_param_ad_aftc_0:
  7468.     tst.b    p_aftc_sw(a5)
  7469.     beq    1f
  7470.     btst.b    #b_aftc_tiesync,p_aftc_flg(a5)    *タイ/スラー・ケースではホールドか
  7471.     bne    @f                *hold
  7472.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7473.     beq    fm_aftc
  7474. 1:
  7475.     rts
  7476. @@:
  7477.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7478.     beq    @f
  7479.     subq.w    #1,p_aftc_syncnt2(a5)
  7480.     bne    1b
  7481. @@:
  7482.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7483.     bra    fm_aftc                *sync
  7484.  
  7485. tie_calc_param_fm_pmod_0:
  7486. tie_calc_param_ad_pmod_0:
  7487.     tst.b    p_pmod_sw(a5)
  7488.     beq    1f
  7489.     btst.b    #b_pmod_tiesync,p_pmod_flg(a5)    *タイ/スラー・ケースではホールドか
  7490.     bne    @f                *hold
  7491.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7492.     beq    3f
  7493. 1:
  7494.     rts
  7495. @@:
  7496.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7497.     beq    3f
  7498.     subq.w    #1,p_pmod_syncnt2(a5)
  7499.     bne    1b
  7500. 2:
  7501.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7502.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7503.     tst.w    p_pmod_dpt_now(a5)
  7504.     bne    @f
  7505.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7506. @@:
  7507.     moveq.l    #4,d6
  7508.     bra    fm_pmod                *sync
  7509. 3:
  7510.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7511.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7512.     moveq.l    #4,d6
  7513.     bra    fm_pmod                *sync
  7514.  
  7515. tie_calc_param_fm_aftc_1:
  7516. tie_calc_param_ad_aftc_1:
  7517.     tst.b    p_aftc_sw(a5)
  7518.     beq    2f
  7519.     btst.b    #b_aftc_rstsync,p_aftc_flg(a5)
  7520.     beq    1f
  7521.     btst.b    #b_aftc_tiesync,p_aftc_flg(a5)    *タイ/スラー・ケースではホールドか
  7522.     bne    @f                *hold
  7523. 1:
  7524.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7525.     beq    fm_aftc
  7526. 2:
  7527.     rts
  7528. @@:
  7529.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7530.     beq    @f
  7531.     subq.w    #1,p_aftc_syncnt2(a5)
  7532.     bne    2b
  7533. @@:
  7534.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7535.     bra    fm_aftc                *sync
  7536.  
  7537. tie_calc_param_fm_pmod_1:            *rest case
  7538. tie_calc_param_ad_pmod_1:            *rest case
  7539.     tst.b    p_pmod_sw(a5)
  7540.     beq    2f
  7541.     btst.b    #b_pmod_rstsync,p_pmod_flg(a5)
  7542.     beq    1f
  7543. *!3/26    btst.b    #b_pmod_tiesync,p_pmod_flg(a5)    *タイ/スラー・ケースではホールドか
  7544. *!3/26    bne    @f                *hold
  7545. 1:
  7546.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7547.     beq    4f
  7548. 2:
  7549.     rts
  7550. @@:
  7551.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7552.     beq    4f
  7553.     subq.w    #1,p_pmod_syncnt2(a5)
  7554.     bne    2b
  7555. 3:
  7556.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7557.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7558.     tst.w    p_pmod_dpt_now(a5)
  7559.     bne    @f
  7560.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7561. @@:
  7562.     moveq.l    #4,d6
  7563.     bra    fm_pmod                *sync
  7564. 4:
  7565.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7566.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7567.     moveq.l    #4,d6
  7568.     bra    fm_pmod                *sync
  7569.  
  7570. tie_calc_param_fm_arcc_0:
  7571. tie_calc_param_ad_arcc_0:
  7572.     move.w    #$0080,d6
  7573.     moveq.l    #arcc_max-1,d7
  7574.     lea    p_arcc_param(a5),a4
  7575. @@:
  7576.     tst.b    p_arcc_sw(a4)
  7577.     beq    4f
  7578.     btst.b    #b_arcc_tiesync,p_arcc_flg(a4)    *タイ/スラー・ケースではホールドか
  7579.     bne    1f                *=0:hold =1:sync
  7580.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7581.     beq    5f
  7582.     lea    __arcc_len(a4),a4
  7583.     lsr.b    #1,d6
  7584.     dbra    d7,@b
  7585.     rts
  7586. 1:
  7587.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7588.     beq    5f
  7589.     subq.w    #1,p_arcc_syncnt2(a4)
  7590.     bne    4f
  7591. 2:
  7592.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7593.     move.b    #1,p_arcc_chain(a4)        *接続待機
  7594.     tst.b    p_arcc_dpt_now(a4)
  7595.     bne    3f
  7596.     addq.b    #1,p_arcc_chain(a4)        *即接続(つまり同期)
  7597. 3:
  7598.     bsr    fm_arcc                *sync
  7599. 4:
  7600.     lea    __arcc_len(a4),a4
  7601.     lsr.b    #1,d6
  7602.     dbra    d7,@b
  7603.     rts
  7604. 5:
  7605.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7606.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7607.     bsr    fm_arcc                *sync
  7608.     lea    __arcc_len(a4),a4
  7609.     lsr.b    #1,d6
  7610.     dbra    d7,@b
  7611.     rts
  7612.  
  7613. tie_calc_param_fm_arcc_1:
  7614. tie_calc_param_ad_arcc_1:
  7615.     move.w    #$0080,d6
  7616.     moveq.l    #arcc_max-1,d7
  7617.     lea    p_arcc_param(a5),a4
  7618. @@:
  7619.     tst.b    p_arcc_sw(a4)
  7620.     beq    5f
  7621.     btst.b    #b_arcc_rstsync,p_arcc_flg(a4)
  7622.     beq    1f
  7623.     btst.b    #b_arcc_tiesync,p_arcc_flg(a4)    *タイ/スラー・ケースではホールドか
  7624.     bne    2f                *=0:hold =1:sync
  7625. 1:
  7626.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7627.     beq    6f
  7628.     lea    __arcc_len(a4),a4
  7629.     lsr.b    #1,d6
  7630.     dbra    d7,@b
  7631.     rts
  7632. 2:
  7633.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7634.     beq    6f
  7635.     subq.w    #1,p_arcc_syncnt2(a4)
  7636.     bne    5f
  7637. 3:
  7638.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7639.     move.b    #1,p_arcc_chain(a4)        *接続待機
  7640.     tst.b    p_arcc_dpt_now(a4)
  7641.     bne    4f
  7642.     addq.b    #1,p_arcc_chain(a4)        *即接続(つまり同期)
  7643. 4:
  7644.     bsr    fm_arcc                *sync
  7645. 5:
  7646.     lea    __arcc_len(a4),a4
  7647.     lsr.b    #1,d6
  7648.     dbra    d7,@b
  7649.     rts
  7650. 6:
  7651.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7652.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7653.     bsr    fm_arcc                *sync
  7654.     lea    __arcc_len(a4),a4
  7655.     lsr.b    #1,d6
  7656.     dbra    d7,@b
  7657.     rts
  7658.  
  7659.  
  7660. tie_calc_param_fm_agogik_0:
  7661. tie_calc_param_ad_agogik_0:
  7662. tie_calc_param_md_agogik_0:
  7663.     btst.b    #b_agogik_trmk,p_agogik_flg(a5)
  7664.     beq    4f
  7665.     move.l    a5,a4
  7666.     lea.l    agogik_base(a6),a5
  7667.     btst.b    #_ID_SE,p_track_stat(a4)
  7668.     beq    @f
  7669.     lea.l    agogik_base_se(a6),a5
  7670. @@:
  7671.     tst.b    p_pmod_sw(a5)
  7672.     beq    3f
  7673.     btst.b    #b_agogik_tiesync,p_agogik_flg(a4)    *タイ/スラー・ケースではホールドか
  7674.     bne    @f                *hold
  7675. 1:
  7676.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7677.     beq    5f
  7678.     move.l    a4,a5
  7679.     rts
  7680. @@:
  7681.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7682.     beq    5f
  7683.     subq.w    #1,p_pmod_syncnt2(a5)
  7684.     bne    3f
  7685. 2:
  7686.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7687.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7688.     tst.w    p_pmod_dpt_now(a5)
  7689.     bne    @f
  7690.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7691. @@:
  7692.     moveq.l    #0,d6
  7693.     bsr    fm_pmod                *sync
  7694. 3:
  7695.     move.l    a4,a5
  7696. 4:
  7697.     rts
  7698. 5:
  7699.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7700.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7701.     moveq.l    #0,d6
  7702.     bsr    fm_pmod                *sync
  7703.     move.l    a4,a5
  7704.     rts
  7705.  
  7706. tie_calc_param_fm_agogik_1:
  7707. tie_calc_param_ad_agogik_1:
  7708. tie_calc_param_md_agogik_1:
  7709.     btst.b    #b_agogik_trmk,p_agogik_flg(a5)
  7710.     beq    4f
  7711.     move.l    a5,a4
  7712.     lea.l    agogik_base(a6),a5
  7713.     btst.b    #_ID_SE,p_track_stat(a4)
  7714.     beq    @f
  7715.     lea.l    agogik_base_se(a6),a5
  7716. @@:
  7717.     tst.b    p_pmod_sw(a5)
  7718.     beq    3f
  7719.     btst.b    #b_agogik_rstsync,p_agogik_flg(a4)
  7720.     beq    1f
  7721.     btst.b    #b_agogik_tiesync,p_agogik_flg(a4)    *タイ/スラー・ケースではホールドか
  7722.     bne    @f                *hold
  7723. 1:
  7724.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7725.     beq    5f
  7726.     move.l    a4,a5
  7727.     rts
  7728. @@:
  7729.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7730.     beq    5f
  7731.     subq.w    #1,p_pmod_syncnt2(a5)
  7732.     bne    3f
  7733. 2:
  7734.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7735.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7736.     tst.w    p_pmod_dpt_now(a5)
  7737.     bne    @f
  7738.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7739. @@:
  7740.     moveq.l    #0,d6
  7741.     bsr    fm_pmod                *sync
  7742. 3:
  7743.     move.l    a4,a5
  7744. 4:
  7745.     rts
  7746. 5:
  7747.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7748.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7749.     moveq.l    #0,d6
  7750.     bsr    fm_pmod                *sync
  7751.     move.l    a4,a5
  7752.     rts
  7753.  
  7754. tie_calc_param_md_aftc_0:
  7755.     tst.b    p_aftc_sw(a5)
  7756.     beq    1f
  7757.     btst.b    #b_aftc_tiesync,p_aftc_flg(a5)    *タイ/スラー・ケースではホールドか
  7758.     bne    @f                *hold
  7759.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7760.     beq    midi_aftc
  7761. 1:
  7762.     rts
  7763. @@:
  7764.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7765.     beq    @f
  7766.     subq.w    #1,p_aftc_syncnt2(a5)
  7767.     bne    1b
  7768. @@:
  7769.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7770.     bra    midi_aftc            *sync
  7771.  
  7772. tie_calc_param_md_aftc_1:
  7773.     tst.b    p_aftc_sw(a5)
  7774.     beq    2f
  7775.     btst.b    #b_aftc_rstsync,p_aftc_flg(a5)
  7776.     beq    1f
  7777.     btst.b    #b_aftc_tiesync,p_aftc_flg(a5)    *タイ/スラー・ケースではホールドか
  7778.     bne    @f                *hold
  7779. 1:
  7780.     bset.b    #b_aftc_first,p_aftc_flg(a5)    *最初ならばホールドでもパラメータ計算
  7781.     beq    midi_aftc
  7782. 2:
  7783.     rts
  7784. @@:
  7785.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7786.     beq    @f
  7787.     subq.w    #1,p_aftc_syncnt2(a5)
  7788.     bne    2b
  7789. @@:
  7790.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7791.     bra    midi_aftc            *sync
  7792.  
  7793. tie_calc_param_md_pmod_0:
  7794.     tst.b    p_pmod_sw(a5)
  7795.     beq    1f
  7796.     btst.b    #b_pmod_tiesync,p_pmod_flg(a5)    *タイ/スラー・ケースではホールドか
  7797.     bne    @f                *hold
  7798.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7799.     beq    3f
  7800. 1:
  7801.     rts
  7802. @@:
  7803.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7804.     beq    3f
  7805.     subq.w    #1,p_pmod_syncnt2(a5)
  7806.     bne    1b
  7807. 2:
  7808.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7809.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7810.     tst.w    p_pmod_dpt_now(a5)
  7811.     bne    @f
  7812.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7813. @@:
  7814.     moveq.l    #4,d6
  7815.     bra    midi_pmod            *sync
  7816. 3:
  7817.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7818.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7819.     moveq.l    #4,d6
  7820.     bra    midi_pmod            *sync
  7821.  
  7822. tie_calc_param_md_pmod_1:            *rest case
  7823.     tst.b    p_pmod_sw(a5)
  7824.     beq    2f
  7825.     btst.b    #b_pmod_rstsync,p_pmod_flg(a5)
  7826.     beq    1f
  7827. *!3/26    btst.b    #b_pmod_tiesync,p_pmod_flg(a5)    *タイ/スラー・ケースではホールドか
  7828. *!3/26    bne    @f                *hold
  7829. 1:
  7830.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7831.     beq    4f
  7832. 2:
  7833.     rts
  7834. @@:
  7835.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7836.     bne    4f
  7837.     subq.w    #1,p_pmod_syncnt2(a5)
  7838.     bne    2b
  7839. 3:
  7840.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7841.     move.b    #1,p_pmod_chain(a5)        *接続待機
  7842.     tst.w    p_pmod_dpt_now(a5)
  7843.     bne    @f
  7844.     addq.b    #1,p_pmod_chain(a5)        *即接続(つまり同期)
  7845. @@:
  7846.     moveq.l    #4,d6
  7847.     bra    midi_pmod            *sync
  7848. 4:
  7849.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7850.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7851.     moveq.l    #4,d6
  7852.     bra    midi_pmod            *sync
  7853.  
  7854. tie_calc_param_md_arcc_0:
  7855.     move.w    #$0080,d6
  7856.     moveq.l    #arcc_max-1,d7
  7857.     lea    p_arcc_param(a5),a4
  7858. @@:
  7859.     tst.b    p_arcc_sw(a4)
  7860.     beq    5f
  7861.     btst.b    #b_arcc_tiesync,p_arcc_flg(a4)    *タイ/スラー・ケースではホールドか
  7862.     bne    2f                *hold
  7863. 1:
  7864.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7865.     beq    6f
  7866.     lea    __arcc_len(a4),a4
  7867.     lsr.b    #1,d6
  7868.     dbra    d7,@b
  7869.     rts
  7870. 2:
  7871.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7872.     beq    6f
  7873.     subq.w    #1,p_arcc_syncnt2(a4)
  7874.     bne    5f
  7875. 3:
  7876.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7877.     move.b    #1,p_arcc_chain(a4)        *接続待機
  7878.     tst.b    p_arcc_dpt_now(a4)
  7879.     bne    4f
  7880.     addq.b    #1,p_arcc_chain(a4)        *即接続(つまり同期)
  7881. 4:
  7882.     bsr    midi_arcc            *sync
  7883. 5:
  7884.     lea    __arcc_len(a4),a4
  7885.     lsr.b    #1,d6
  7886.     dbra    d7,@b
  7887.     rts
  7888. 6:
  7889.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7890.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7891.     bsr    midi_arcc            *sync
  7892.     lea    __arcc_len(a4),a4
  7893.     lsr.b    #1,d6
  7894.     dbra    d7,@b
  7895.     rts
  7896.  
  7897. tie_calc_param_md_arcc_1:
  7898.     move.w    #$0080,d6
  7899.     moveq.l    #arcc_max-1,d7
  7900.     lea    p_arcc_param(a5),a4
  7901. @@:
  7902.     tst.b    p_arcc_sw(a4)
  7903.     beq    5f
  7904.     btst.b    #b_arcc_rstsync,p_arcc_flg(a4)
  7905.     beq    1f
  7906.     btst.b    #b_arcc_tiesync,p_arcc_flg(a4)    *タイ/スラー・ケースではホールドか
  7907.     bne    2f                *hold
  7908. 1:
  7909.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  7910.     beq    6f
  7911.     lea    __arcc_len(a4),a4
  7912.     lsr.b    #1,d6
  7913.     dbra    d7,@b
  7914.     rts
  7915. 2:
  7916.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  7917.     beq    6f
  7918.     subq.w    #1,p_arcc_syncnt2(a4)
  7919.     bne    5f
  7920. 3:
  7921.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7922.     move.b    #1,p_arcc_chain(a4)        *接続待機
  7923.     tst.b    p_arcc_dpt_now(a4)
  7924.     bne    4f
  7925.     addq.b    #1,p_arcc_chain(a4)        *即接続(つまり同期)
  7926. 4:
  7927.     bsr    midi_arcc            *sync
  7928. 5:
  7929.     lea    __arcc_len(a4),a4
  7930.     lsr.b    #1,d6
  7931.     dbra    d7,@b
  7932.     rts
  7933. 6:
  7934.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  7935.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  7936.     bsr    midi_arcc            *sync
  7937.     lea    __arcc_len(a4),a4
  7938.     lsr.b    #1,d6
  7939.     dbra    d7,@b
  7940.     rts
  7941.  
  7942. calc_param_md_aftc_0:
  7943.     tst.b    p_aftc_sw(a5)
  7944.     beq    1f
  7945.     tst.b    p_aftc_flg(a5)
  7946.     bmi    @f
  7947.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7948.     beq    midi_aftc
  7949. 1:
  7950.     rts
  7951. @@:
  7952.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7953.     beq    @f
  7954.     subq.w    #1,p_aftc_syncnt2(a5)
  7955.     bne    1b
  7956. @@:
  7957.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7958.     bra    midi_aftc        *アフタータッチパラメータ
  7959.  
  7960. calc_param_md_aftc_1:
  7961.     tst.b    p_aftc_sw(a5)
  7962.     beq    1f
  7963.     btst.b    #b_aftc_rstsync,p_aftc_flg(a5)
  7964.     bne    @f
  7965.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7966.     beq    midi_aftc
  7967. 1:
  7968.     rts
  7969. @@:
  7970.     bset.b    #b_aftc_first,p_aftc_flg(a5)
  7971.     beq    @f
  7972.     subq.w    #1,p_aftc_syncnt2(a5)
  7973.     bne    1b
  7974. @@:
  7975.     move.w    p_aftc_syncnt(a5),p_aftc_syncnt2(a5)
  7976.     bra    midi_aftc        *アフタータッチパラメータ
  7977.  
  7978. calc_param_md_pmod_0:
  7979.     tst.b    p_pmod_sw(a5)
  7980.     beq    1f
  7981.     tst.b    p_pmod_flg(a5)        *(b_pmod_sync)
  7982.     bmi    @f
  7983.     bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  7984.     beq    2f
  7985. 1:
  7986.     rts
  7987. @@:
  7988.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  7989.     beq    2f
  7990.     subq.w    #1,p_pmod_syncnt2(a5)
  7991.     bne    1b
  7992. 2:
  7993.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  7994.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  7995.     moveq.l    #4,d6
  7996.     bra    midi_pmod            *モジュレーションパラメータ
  7997.  
  7998. calc_param_md_pmod_1:                *rest case
  7999.     tst.b    p_pmod_sw(a5)
  8000.     beq    1f
  8001.     btst.b    #b_pmod_rstsync,p_pmod_flg(a5)
  8002.     bne    @f
  8003. *!3/26    bset.b    #b_pmod_first,p_pmod_flg(a5)    *最初ならばホールドでもパラメータ計算
  8004. *!3/26    beq    2f
  8005. 1:
  8006.     rts
  8007. @@:
  8008.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  8009.     beq    2f
  8010.     subq.w    #1,p_pmod_syncnt2(a5)
  8011.     bne    1b
  8012. 2:
  8013.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  8014.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  8015.     moveq.l    #4,d6
  8016.     bra    midi_pmod            *モジュレーションパラメータ
  8017.  
  8018. calc_param_md_arcc_0:
  8019.     move.w    #$0080,d6
  8020.     moveq.l    #arcc_max-1,d7
  8021.     lea    p_arcc_param(a5),a4
  8022. @@:
  8023.     tst.b    p_arcc_sw(a4)
  8024.     beq    3f
  8025.     tst.b    p_arcc_flg(a4)        *(b_arcc_sync)
  8026.     bmi    1f            *no
  8027.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  8028.     beq    2f
  8029.     lea    __arcc_len(a4),a4
  8030.     lsr.b    #1,d6
  8031.     dbra    d7,@b
  8032.     rts
  8033. 1:
  8034.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  8035.     beq    2f
  8036.     subq.w    #1,p_arcc_syncnt2(a4)
  8037.     bne    3f
  8038. 2:
  8039.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  8040.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  8041.     bsr    midi_arcc
  8042. 3:
  8043.     lea    __arcc_len(a4),a4
  8044.     lsr.b    #1,d6
  8045.     dbra    d7,@b
  8046.     rts
  8047.  
  8048. calc_param_md_arcc_1:
  8049.     move.w    #$0080,d6
  8050.     moveq.l    #arcc_max-1,d7
  8051.     lea    p_arcc_param(a5),a4
  8052. @@:
  8053.     tst.b    p_arcc_sw(a4)
  8054.     beq    3f
  8055.     btst.b    #b_arcc_rstsync,p_arcc_flg(a4)
  8056.     bne    1f
  8057.     bset.b    #b_arcc_first,p_arcc_flg(a4)    *最初ならばホールドでもパラメータ計算
  8058.     beq    2f
  8059.     lea    __arcc_len(a4),a4
  8060.     lsr.b    #1,d6
  8061.     dbra    d7,@b
  8062.     rts
  8063. 1:
  8064.     bset.b    #b_arcc_first,p_arcc_flg(a4)
  8065.     beq    2f
  8066.     subq.w    #1,p_arcc_syncnt2(a4)
  8067.     bne    3f
  8068. 2:
  8069.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  8070.     move.b    #2,p_arcc_chain(a4)        *即接続(つまり同期)
  8071.     bsr    midi_arcc
  8072. 3:
  8073.     lea    __arcc_len(a4),a4
  8074.     lsr.b    #1,d6
  8075.     dbra    d7,@b
  8076.     rts
  8077.  
  8078. fm_bend:                *ベンドパラメータの計算
  8079. midi_bend:
  8080.     tst.b    p_port_flg(a5)
  8081.     bne    exit_fm_bend        *ポルタメント中はオートベンドしない
  8082.     tst.b    p_bend_sw(a5)
  8083.     beq    exit_fm_bend
  8084.     tas.b    p_bend_sw(a5)        *firstマーク
  8085.     ori.w    #2,p_pitch_param(a5)    *mark
  8086.     moveq.l    #0,d6
  8087.     move.l    d6,p_port_pitch(a5)    *ちゃっかり初期化
  8088.     move.l    d6,p_port_step(a5)    *一応初期化
  8089.     move.w    p_bend_dly(a5),d6    *ベンドディレイ値を
  8090.     bpl    @f
  8091.     move.w    d6,d1
  8092.     neg.w    d1
  8093.     add.w    d5,d6
  8094.     ble    exit_fm_bend        *delayの方が大きい場合
  8095.     move.w    d6,p_port_dly(a5)    *portament delayの所にセット
  8096.     bra    1f
  8097. @@:
  8098.     move.w    d6,p_port_dly(a5)    *portament delayの所にセット
  8099.     move.w    d5,d1            *get step
  8100.     sub.w    d6,d1            *step=step-delay->port time
  8101.     ble    exit_fm_bend        *delayの方が大きい場合
  8102. 1:
  8103.     move.w    p_bend_cnt(a5),d6    *minus:tail,plus:port time
  8104.     beq    prprbd00
  8105.     bpl    @f
  8106.     add.w    d6,d1
  8107.     bgt    prprbd00        *tailの方が大きい場合は
  8108.     sub.w    d6,d1            *さっきの演算(add.w d6,d1)はなかったことにする
  8109.     bra    prprbd00
  8110. @@:
  8111.     cmp.w    d1,d6
  8112.     bcc    @f
  8113.     move.l    d6,d1
  8114. prprbd00:
  8115.     move.w    d1,p_port_cnt(a5)
  8116.     move.w    p_bend_dst(a5),d6
  8117.     sub.w    p_detune(a5),d6
  8118.     bmi    @f
  8119.     divu    d1,d6        *d6=range/L d6.w=step counter
  8120.     move.w    d6,d0
  8121.     clr.w    d6
  8122.     divu    d1,d6        *d6=d6/L
  8123.     swap    d0
  8124.     move.w    d6,d0
  8125.     addq.l    #1,d0
  8126.     move.l    d0,p_port_step(a5)
  8127.     rts
  8128. @@:
  8129.     neg.w    d6
  8130.     divu    d1,d6        *d6=range/L d6.w=step counter
  8131.     move.w    d6,d0
  8132.     clr.w    d6
  8133.     divu    d1,d6        *d6=d6/L
  8134.     swap    d0
  8135.     move.w    d6,d0
  8136.     neg.l    d0
  8137.     move.l    d0,p_port_step(a5)
  8138. exit_fm_bend:
  8139.     rts
  8140.  
  8141. fm_aftc:            *アフタータッチシーケンスパラメータ
  8142.     tst.b    p_aftc_sw(a5)
  8143.     beq    exit_fm_aftc    *0(off)
  8144.     bpl    @f        *1(optionl mode case)
  8145.     ori.w    #2,p_level_param(a5)    *mark(midi_aftcとはこれが有るか無いかの違いだけ)
  8146.     move.l    d5,d1
  8147.     lsr.w    #3,d1        *d1=step/8
  8148.                 *ゼロになっちゃっても後でつじつまが合うから大丈夫
  8149.     move.w    d1,p_aftc_dly2(a5)
  8150.     lea    p_aftc_8st_tbl+2(a5),a1
  8151.     rept    aftc_max-1
  8152.     move.w    d1,(a1)+    *1/8ステップを8-1個分書く
  8153.     endm
  8154.     clr.b    p_aftc_n(a5)    *init pointer
  8155.     rts
  8156. @@:                *任意モードの場合
  8157.     ori.w    #2,p_level_param(a5)    *mark(midi_aftcとはこれが有るか無いかの違いだけ)
  8158.     move.w    p_aftc_1st_dly(a5),d1
  8159.     bmi    fmaftc_dly_mi
  8160.     bne    fmaftc_dly_nz
  8161. fmaftc_dly_0:            *ディレイ=0
  8162.     move.w    p_aftc_8st_tbl(a5),p_aftc_dly2(a5)    *1個目のintervalを有効とする
  8163.     clr.b    p_aftc_n(a5)    *init pointer
  8164. exit_fm_aftc:
  8165.     rts
  8166.  
  8167. fmaftc_dly_mi:            *ディレイ<0
  8168.     add.w    d5,d1
  8169.     ble    fmaftc_dly_0
  8170. fmaftc_dly_nz:            *ディレイ>0
  8171.     move.w    d1,p_aftc_dly2(a5)
  8172.     st.b    p_aftc_n(a5)    *init pointer
  8173.     rts
  8174.  
  8175. midi_aftc:            *アフタータッチシーケンスパラメータ
  8176.     tst.b    p_aftc_sw(a5)
  8177.     beq    exit_md_aftc    *0(off)
  8178.     bpl    @f        *1(optionl mode case)
  8179.     ori.w    #$4000,p_level_param(a5)    *mark(midi_aftcとはこれの違いだけ)
  8180.     move.l    d5,d1
  8181.     lsr.w    #3,d1        *d1=step/8
  8182.                 *ゼロになっちゃっても後でつじつまが合うから大丈夫
  8183.     move.w    d1,p_aftc_dly2(a5)
  8184.     lea    p_aftc_8st_tbl+2(a5),a1
  8185.     rept    aftc_max-1
  8186.     move.w    d1,(a1)+    *1/8ステップを8-1個分書く
  8187.     endm
  8188.     clr.b    p_aftc_n(a5)    *init pointer
  8189.     rts
  8190. @@:                *任意モードの場合
  8191.     ori.w    #$4000,p_level_param(a5)    *mark(midi_aftcとはこれの違いだけ)
  8192.     move.w    p_aftc_1st_dly(a5),d1
  8193.     bmi    mdaftc_dly_mi
  8194.     bne    mdaftc_dly_nz
  8195. mdaftc_dly_0:            *ディレイ=0
  8196.     move.w    p_aftc_8st_tbl(a5),p_aftc_dly2(a5)    *1個目のintervalを有効とする
  8197.     clr.b    p_aftc_n(a5)    *init pointer
  8198. exit_md_aftc:
  8199.     rts
  8200.  
  8201. mdaftc_dly_mi:            *ディレイ<0
  8202.     add.w    d5,d1
  8203.     ble    mdaftc_dly_0
  8204. mdaftc_dly_nz:            *ディレイ>0
  8205.     move.w    d1,p_aftc_dly2(a5)
  8206.     st.b    p_aftc_n(a5)    *init pointer(-1にしておくことで一回目が-1+1=0番目のaftc値が使用される)
  8207.     rts
  8208.  
  8209. fm_pmod:            *ピッチモジュレーションパラメータ
  8210.     * < d6.w=marker(0,4)
  8211.     tst.b    p_pmod_sw(a5)
  8212.     beq    exit_fm_pmod
  8213.     bmi    case_18_pmod        *1/8モード
  8214.                     *以下ディレイモード(&任意モード)
  8215.     or.w    d6,p_pitch_param(a5)    *mark
  8216.     moveq.l    #0,d2
  8217.     move.w    p_pmod_1st_dly(a5),d1
  8218.     bmi    fp_dly_mi            *case:delay<0
  8219.     bne    fp_dly_nz            *case:delay>0
  8220. fp_dly_0:                    *case:delay=0
  8221.     move.w    p_pmod_8st_tbl(a5),p_pmod_dly2(a5)
  8222.     move.b    d2,p_pmod_n(a5)        *0
  8223.     btst.b    d2,p_pmod_omt(a5)
  8224.     beq    cont_last_pm        *先頭が省略ならば前回のを継続
  8225.     move.w    p_pmod_dpt_tbl(a5),p_pmod_dpt_now(a5)
  8226.     move.w    p_pmod_spd_tbl(a5),d1
  8227.     move.w    p_pmod_wf(a5),d2
  8228.     bmi    wv_pmod
  8229.     move.b    _fp1(pc,d2.w),d2
  8230.     jmp    _fp1(pc,d2.w)
  8231. _fp1:    dc.b    svpmsp-_fp1        *saw
  8232.     dc.b    fpkuk-_fp1        *sqa
  8233.     dc.b    svpmsp-_fp1        *tri
  8234.     dc.b    svpmsp-_fp1        *saw2
  8235.     dc.b    fpnos-_fp1        *noise
  8236.     .even
  8237.  
  8238. case_18_pmod:                *1/8モードのケース
  8239.     or.w    d6,p_pitch_param(a5)    *mark
  8240.     moveq.l    #0,d2
  8241.     move.b    d2,p_pmod_n(a5)        *0
  8242.     move.w    d5,d1
  8243.     lsr.w    #3,d1            *d1=step/8
  8244.     move.w    d1,p_pmod_dly2(a5)    *init interval
  8245.     lea    p_pmod_8st_tbl+2(a5),a1
  8246.     rept    modu_max-1
  8247.     move.w    d1,(a1)+
  8248.     endm
  8249.     btst.b    d2,p_pmod_omt(a5)
  8250.     beq    cont_last_pm        *先頭が省略ならば前回のを継続
  8251.     move.w    p_pmod_dpt_tbl(a5),p_pmod_dpt_now(a5)
  8252.     move.w    p_pmod_spd_tbl(a5),d1
  8253.     move.w    p_pmod_wf(a5),d2
  8254.     bmi    wv_pmod
  8255.     move.b    _fp1(pc,d2.w),d2
  8256.     jmp    _fp1(pc,d2.w)
  8257. cont_last_pm:
  8258.     st.b    p_pmod_chain(a5)
  8259. exit_fm_pmod:
  8260.     rts
  8261.  
  8262. svpmsp:                            *swa,tri,saw2
  8263.     move.w    d1,p_pmod_spd_next(a5)            *init speed work
  8264.     move.l    p_pmod_stp_tbl(a5),p_pmod_step_next(a5)    *init step
  8265.     clr.l    p_pmod_rndcnt(a5)            *p_pmod_rndcnt=0,p_pmod_dpntime=0
  8266.     cmpi.b    #2,p_pmod_chain(a5)
  8267.     bne    @f
  8268.     clr.l    p_pmod_pitch(a5)
  8269. @@:
  8270.     rts
  8271.  
  8272. fpkuk:                            *square
  8273.     move.w    d1,p_pmod_spd_next(a5)            *init speed work
  8274.     move.w    p_pmod_dpt_tbl(a5),d0
  8275.     move.w    d0,p_pmod_step_next(a5)            *init step
  8276.     clr.l    p_pmod_rndcnt(a5)            *p_pmod_rndcnt=0,p_pmod_dpntime=0
  8277.     cmpi.b    #2,p_pmod_chain(a5)
  8278.     bne    @f
  8279.     move.w    d0,p_pmod_pitch(a5)
  8280. @@:
  8281.     rts
  8282.  
  8283. fpnos:                    *ノイズのケース
  8284.     clr.l    p_pmod_rndcnt(a5)    *p_pmod_rndcnt=0,p_pmod_dpntime=0
  8285.     cmpi.b    #2,p_pmod_chain(a5)
  8286.     beq    @f
  8287.                     *待機ケース
  8288.     move.w    d1,p_pmod_spd_next(a5)    *init speed work
  8289.     move.w    p_pmod_dpt_tbl(a5),p_pmod_step_next(a5)    *ノイズ波形の場合、step2は振幅
  8290.     rts
  8291. @@:                    *同期ケース
  8292.     move.w    p_pmod_wf(a5),p_pmod_wf2(a5)
  8293.     move.w    d1,p_pmod_spd(a5)
  8294.     lsr.w    #1,d1            *d1=d1/2
  8295.     move.w    d1,p_pmod_spd2(a5)    *init speed work
  8296.     move.w    p_pmod_dpt_tbl(a5),d1
  8297.     move.w    d1,p_pmod_step2(a5)    *ノイズ波形の場合、step2は振幅
  8298.     bsr    get_rand
  8299.     muls    d1,d0
  8300.     swap    d0
  8301.     add.w    d0,d0
  8302.     move.w    d0,p_pmod_pitch(a5)
  8303.     st.b    p_pmod_chain(a5)
  8304.     rts
  8305.  
  8306. wv_pmod:                *波形メモリのケース
  8307.     clr.b    p_altp_flg(a5)        *反復モードスイッチオフ
  8308.     clr.l    p_pmod_rndcnt(a5)    *p_pmod_rndcnt=0,p_pmod_dpntime=0
  8309.     cmpi.b    #2,p_pmod_chain(a5)
  8310.     beq    @f
  8311.                     *待機ケース
  8312.     move.w    d1,p_pmod_spd_next(a5)
  8313.     move.w    p_pmod_dpt_tbl(a5),p_pmod_step_next(a5)    *振幅を入れておく
  8314.     rts
  8315. @@:                    *同期ケース
  8316.     move.w    p_pmod_wf(a5),p_pmod_wf2(a5)
  8317.     move.w    d1,p_pmod_spd(a5)
  8318.     lsr.w    #1,d1            *d1=d1/2
  8319.     move.w    d1,p_pmod_spd2(a5)    *init speed work
  8320.     move.w    p_pmod_dpt_tbl(a5),p_pmod_step2(a5)    *振幅を入れておく
  8321.     move.l    p_wvpm_start(a5),p_wvpm_point(a5)
  8322.     move.l    p_wvpm_lptm(a5),p_wvpm_lptm2(a5)
  8323.     st.b    p_pmod_chain(a5)
  8324.     bset.b    #b_pmod_syncok,p_pmod_flg(a5)
  8325.     bra    pmod_wvmm        *p_pmod_pitchへ値を強引に設定
  8326.  
  8327. fp_dly_mi:                *ディレイ<0
  8328.     add.w    d5,d1
  8329.     ble    fp_dly_0
  8330. fp_dly_nz:                *ディレイ>0
  8331.     move.w    d1,p_pmod_dly2(a5)    *init delay
  8332.     st.b    p_pmod_n(a5)        *-1
  8333.     move.l    d2,p_pmod_rndcnt(a5)    *p_pmod_rndcnt=0,p_pmod_dpntime=0
  8334.     cmpi.b    #2,p_pmod_chain(a5)
  8335.     bne    @f
  8336.     move.l    d2,p_pmod_pitch(a5)    *0
  8337.     move.l    d2,p_pmod_step2(a5)    *0
  8338. @@:
  8339.     rts
  8340.  
  8341. midi_pmod:                *ピッチモジュレーションパラメータ
  8342.     tst.b    p_pmod_mode(a5)
  8343.     bpl    fm_pmod            *拡張ピッチモジュレーション
  8344.     tst.b    p_pmod_sw(a5)
  8345.     beq    exit_midi_pmod
  8346.     bmi    case_18_pmod_md
  8347.  
  8348.     ori.w    #$8000,p_level_param(a5)    *mark
  8349.     move.w    p_pmod_1st_dly(a5),d1
  8350.     bmi    mp_dly_mi        *case:delay<0
  8351.     bne    mp_dly_nz        *case:delay>0
  8352. mp_dly_0:                *case:delay=0
  8353.     move.w    p_pmod_8st_tbl(a5),p_pmod_dly2(a5)
  8354.     clr.b    p_pmod_n(a5)
  8355.     btst.b    #0,p_pmod_omt(a5)
  8356.     beq    exit_midi_pmod
  8357.     move.w    p_pmod_dpt_tbl(a5),d1
  8358.     move.w    d1,p_pmod_dpt_now(a5)
  8359.     move.w    d1,p_pmod_pitch(a5)
  8360. exit_midi_pmod:
  8361.     rts
  8362. case_18_pmod_md:            *ディレイがゼロのケース
  8363.     ori.w    #$8000,p_level_param(a5)    *mark
  8364.     clr.b    p_pmod_n(a5)
  8365.     move.w    d5,d1
  8366.     lsr.w    #3,d1
  8367.     move.w    d1,p_pmod_dly2(a5)    *init interval
  8368.     lea    p_pmod_8st_tbl+2(a5),a1
  8369.     rept    modu_max-1
  8370.     move.w    d1,(a1)+
  8371.     endm
  8372.     btst.b    #0,p_pmod_omt(a5)
  8373.     beq    exit_midi_pmod
  8374.     move.w    p_pmod_dpt_tbl(a5),d1
  8375.     move.w    d1,p_pmod_dpt_now(a5)
  8376.     move.w    d1,p_pmod_pitch(a5)
  8377.     rts
  8378.  
  8379. mp_dly_mi:
  8380.     add.w    d5,d1
  8381.     ble    mp_dly_0
  8382. mp_dly_nz:
  8383.     move.w    d1,p_pmod_dly2(a5)    *init delay
  8384.     st.b    p_pmod_n(a5)
  8385.     clr.w    p_pmod_pitch(a5)
  8386.     rts
  8387.  
  8388. fm_arcc:                *ARCC/AMODパラメータ
  8389.     * d6 d7 a4 破壊禁止
  8390.     tst.b    p_arcc_sw(a4)
  8391.     beq    exit_fm_arcc
  8392.     bmi    case_18_arcc        *1/8モード
  8393.                     *以下ディレイモード(&任意モード)
  8394.     or.w    d6,p_level_param(a5)    *mark
  8395.     moveq.l    #0,d2
  8396.     move.w    p_arcc_1st_dly(a4),d1
  8397.     bmi    fa_dly_mi                *case:delay<0
  8398.     bne    fa_dly_nz                *case:delay>0
  8399. fa_dly_0:                        *case:delay=0
  8400.     move.w    p_arcc_8st_tbl(a4),p_arcc_dly2(a4)
  8401.     move.b    d2,p_arcc_n(a4)        *0
  8402.     btst.b    d2,p_arcc_omt(a4)
  8403.     beq    cont_last_am        *先頭が省略ならば前回のを継続
  8404.     move.b    p_arcc_dpt_tbl(a4),p_arcc_dpt_now(a4)
  8405.     move.w    p_arcc_spd_tbl(a4),d1
  8406.     move.w    p_arcc_wf(a4),d2
  8407.     bmi    wv_arcc
  8408.     move.b    _fa1(pc,d2.w),d2
  8409.     jmp    _fa1(pc,d2.w)
  8410. _fa1:    dc.b    fasaw-_fa1        *saw
  8411.     dc.b    fakuk-_fa1        *sqa
  8412.     dc.b    fatri-_fa1        *tri
  8413.     dc.b    fasaw-_fa1        *saw2
  8414.     dc.b    fanos-_fa1        *noise
  8415.     .even
  8416.  
  8417. case_18_arcc:                *1/8モードのケース
  8418.     or.w    d6,p_level_param(a5)    *mark
  8419.     moveq.l    #0,d2
  8420.     move.b    d2,p_arcc_n(a4)        *0
  8421.     move.w    d5,d1
  8422.     lsr.w    #3,d1
  8423.     move.w    d1,p_arcc_dly2(a4)    *init interval
  8424.     lea    p_arcc_8st_tbl+2(a4),a1
  8425.     rept    modu_max-1
  8426.     move.w    d1,(a1)+
  8427.     endm
  8428.     btst.b    d2,p_arcc_omt(a4)
  8429.     beq    cont_last_am        *先頭が省略ならば前回のを継続
  8430.     move.b    p_arcc_dpt_tbl(a4),p_arcc_dpt_now(a4)
  8431.     move.w    p_arcc_spd_tbl(a4),d1
  8432.     move.w    p_arcc_wf(a4),d2
  8433.     bmi    wv_arcc
  8434.     move.b    _fa1(pc,d2.w),d2
  8435.     jmp    _fa1(pc,d2.w)
  8436. cont_last_am:
  8437.     st.b    p_arcc_chain(a4)
  8438. exit_fm_arcc:
  8439.     rts
  8440.  
  8441. fasaw:                        *ノコギリ波
  8442. fakuk:                        *矩形波
  8443. fatri:                        *三角波
  8444.     move.w    d1,p_arcc_spd_next(a4)        *init speed work
  8445.     move.w    p_arcc_stp_tbl(a4),p_arcc_step_next(a4)    *init step
  8446.     move.b    p_arcc_dpt_tbl(a4),d1
  8447.     bmi    @f
  8448.     moveq.l    #0,d1
  8449. @@:
  8450.     lsl.w    #8,d1
  8451.     move.w    d1,p_arcc_o_next(a4)        *ノコギリ波専用
  8452.     clr.l    p_arcc_rndcnt(a4)        *p_arcc_rndcnt=0,p_arcc,dpntime=0
  8453.     cmpi.b    #2,p_arcc_chain(a4)
  8454.     bne    @f
  8455.     move.w    d1,p_arcc_level(a4)
  8456. @@:
  8457.     rts
  8458.  
  8459. fanos:                        *ノイズ
  8460.     clr.l    p_arcc_rndcnt(a4)        *p_arcc_rndcnt=0,p_arcc,dpntime=0
  8461.     cmpi.b    #2,p_arcc_chain(a4)
  8462.     beq    @f
  8463.                         *待機ケース
  8464.     move.w    d1,p_arcc_spd_next(a4)        *init speed work
  8465.     move.b    p_arcc_dpt_tbl(a4),p_arcc_step_next(a4)
  8466.     rts
  8467. @@:                        *同期ケース
  8468.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  8469.     move.w    d1,p_arcc_spd(a4)
  8470.     lsr.w    #1,d1
  8471.     move.w    d1,p_arcc_spd2(a4)        *init speed work
  8472.     move.b    p_arcc_dpt_tbl(a4),d1
  8473.     move.b    d1,p_arcc_step2(a4)
  8474.     bsr    get_rand
  8475.     ext.w    d1
  8476.     bpl    @f
  8477.     neg.w    d1
  8478. @@:
  8479.     mulu    d1,d0
  8480.     swap    d0
  8481.     neg.b    d0
  8482.     move.b    d0,p_arcc_level(a4)
  8483.     st.b    p_arcc_chain(a4)
  8484.     rts
  8485.  
  8486. wv_arcc:
  8487.     clr.b    p_alta_flg(a4)            *反復モードスイッチオフ
  8488.     clr.l    p_arcc_rndcnt(a4)        *p_arcc_rndcnt=0,p_arcc,dpntime=0
  8489.     cmpi.b    #2,p_arcc_chain(a4)
  8490.     beq    @f
  8491.                         *待機ケース
  8492.     move.w    d1,p_arcc_spd_next(a4)        *init speed work
  8493.     move.b    p_arcc_dpt_tbl(a4),p_arcc_step_next(a4)    *振幅を入れておく
  8494.     rts
  8495. @@:                        *同期ケース
  8496.     move.w    p_arcc_wf(a4),p_arcc_wf2(a4)
  8497.     move.w    d1,p_arcc_spd(a4)
  8498.     lsr.w    #1,d1                *d1=d1/2
  8499.     move.w    d1,p_arcc_spd2(a4)        *init speed work
  8500.     move.b    p_arcc_dpt_tbl(a4),p_arcc_step2(a4)    *振幅を入れておく
  8501.     move.l    p_wvam_start(a4),p_wvam_point(a4)
  8502.     move.l    p_wvam_lptm(a4),p_wvam_lptm2(a4)
  8503.     st.b    p_arcc_chain(a4)
  8504.     tas.b    p_arcc_flg2(a4)            *bset.b    #b_arcc_syncok,p_arcc_flg2(a4)
  8505.     bra    arcc_wvmm            *p_arcc_levelへ値を強引に設定
  8506.  
  8507. fa_dly_mi:                    *ディレイ<0
  8508.     add.w    d5,d1
  8509.     ble    fa_dly_0
  8510. fa_dly_nz:                    *ディレイ>0
  8511.     move.w    d1,p_arcc_dly2(a4)            *init delay
  8512.     st.b    p_arcc_n(a4)            *-1
  8513.     move.l    d2,p_arcc_rndcnt(a4)        *p_arcc_rndcnt=0,p_arcc_dpntime=0
  8514.     cmpi.b    #2,p_arcc_chain(a4)
  8515.     bne    @f
  8516.     move.w    d2,p_arcc_level(a4)        *0
  8517.     move.w    d2,p_arcc_step2(a4)        *0
  8518. @@:
  8519.     rts
  8520.  
  8521. midi_arcc:                *arccパラメータ計算
  8522.     * d6 d7 a4 破壊禁止
  8523.     tst.b    p_arcc_mode(a4)
  8524.     bpl    fm_arcc
  8525.     tst.b    p_arcc_sw(a4)
  8526.     beq    exit_midi_arcc
  8527.     bmi    case_18_arcc_md
  8528.  
  8529.     or.w    d6,p_level_param(a5)        *mark
  8530.     move.w    p_arcc_1st_dly(a4),d1
  8531.     bmi    ma_dly_mi            *case:delay<0
  8532.     bne    ma_dly_nz            *case:delay>0
  8533. ma_dly_0:                    *case:delay=0
  8534.     move.w    p_arcc_8st_tbl(a4),p_arcc_dly2(a4)    *init delay
  8535.     clr.b    p_arcc_n(a4)
  8536.     btst.b    #0,p_arcc_omt(a4)
  8537.     beq    exit_midi_arcc
  8538.     move.b    p_arcc_dpt_tbl(a4),d1
  8539.     move.b    d1,p_arcc_dpt_now(a4)
  8540.     move.b    d1,p_arcc_level(a4)
  8541. exit_midi_arcc:
  8542.     rts
  8543. case_18_arcc_md:            *ディレイが0のケース
  8544.     or.w    d6,p_level_param(a5)        *mark
  8545.     clr.b    p_arcc_n(a4)
  8546.     move.w    d5,d1
  8547.     lsr.w    #3,d1
  8548.     move.w    d1,p_arcc_dly2(a4)    *init interval
  8549.     lea    p_arcc_8st_tbl+2(a4),a1
  8550.     rept    modu_max-1
  8551.     move.w    d1,(a1)+
  8552.     endm
  8553.     btst.b    #0,p_arcc_omt(a4)
  8554.     beq    exit_midi_arcc
  8555.     move.b    p_arcc_dpt_tbl(a4),d1
  8556.     move.b    d1,p_arcc_dpt_now(a4)
  8557.     move.b    d1,p_arcc_level(a4)
  8558.     rts
  8559.  
  8560. ma_dly_mi:                *delay<0
  8561.     add.w    d5,d1
  8562.     ble    ma_dly_0
  8563. ma_dly_nz:                *delay>0
  8564.     move.w    d1,p_arcc_dly2(a4)        *init delay
  8565.     st.b    p_arcc_n(a4)
  8566.     move.b    p_arcc_reset(a4),p_arcc_level(a4)
  8567.     rts
  8568.  
  8569. get_rand:                *乱数生成
  8570.     * > d0.w=fixed random number
  8571.     * - all
  8572.     movem.l    d1/a1-a2,-(sp)
  8573.     movem.l    mr_xp(pc),a1-a2
  8574.     move.w    (a1),d0
  8575.     move.w    (a2)+,d1
  8576.  
  8577.     eor.w    d1,d0
  8578.     move.w    d0,(a1)+
  8579.  
  8580.     cmp.l    mr_max(pc),a1
  8581.     bne    @f
  8582.     move.l    estbn(pc),a1
  8583. @@:
  8584.     cmp.l    mr_max(pc),a2
  8585.     bne    @f
  8586.     move.l    estbn(pc),a2
  8587. @@:
  8588.     movem.l    a1-a2,mr_xp-work(a6)
  8589.     movem.l    (sp)+,d1/a1-a2
  8590.     rts
  8591.  
  8592. mr_xp:    ds.l    2
  8593. mr_max:    ds.l    1
  8594. *------------------------------------------------------------------------------
  8595. rltv_pan_fm:                *FM パンポット相対指定
  8596.     move.b    p_pan(a5),d2
  8597.     bmi    next_cmd_fm        *PAN off時には相対指定無効
  8598.     add.b    (a0)+,d2
  8599.     bpl    _panpot_fm
  8600.     tst.b    -1(a0)
  8601.     bpl    @f
  8602.     moveq.l    #0,d2
  8603.     bra    _panpot_fm
  8604. @@:
  8605.     moveq.l    #127,d2
  8606.     bra    _panpot_fm
  8607.  
  8608. panpot_fm:                *FM パンポット絶対指定
  8609.     move.b    (a0)+,d2
  8610. _panpot_fm:
  8611.     move.b    d2,p_pan(a5)        *save trk wk
  8612.     bsr    conv_p@p
  8613.     ror.b    #2,d2
  8614.     move.b    opmreg+AF(a6,d4.w),d1
  8615.     andi.w    #%0011_1111,d1
  8616.     or.b    d1,d2
  8617.     moveq.l    #$20,d1
  8618.     or.b    d4,d1
  8619.     move.l    p_opmset(a5),a4
  8620.     jsr    (a4)            *opmset
  8621.     bra    next_cmd_fm
  8622.  
  8623. rltv_pan_md:                *MIDI パンポット相対指定
  8624.     move.b    p_pan(a5),d2
  8625.     bmi    next_cmd_md        *PAN off時には相対指定無効
  8626.     add.b    (a0)+,d2
  8627.     bpl    _panpot_md
  8628.     tst.b    -1(a0)
  8629.     bpl    @f
  8630.     moveq.l    #0,d2
  8631.     bra    _panpot_md
  8632. @@:
  8633.     moveq.l    #127,d2
  8634.     bra    _panpot_md
  8635.  
  8636. check_concur    macro    CTRL
  8637.     * X d1,d2,a4
  8638.     local    ckcr0
  8639.     local    ckcr1
  8640.     local    ckcr2
  8641.     lea    p_arcc_param(a5),a4
  8642.     moveq.l    #7,d1            *(level_param+1)ビットチェックポインタ
  8643.     moveq.l    #arcc_max-1,d2
  8644. ckcr0:
  8645.     cmpi.b    #CTRL,p_arcc(a4)    *ARCCがPANPOTで実行中か
  8646.     bne    ckcr2
  8647.     tst.b    p_arcc_sw(a4)        *ARCCがリセット値を持って終了しているか
  8648.     bne    ckcr1
  8649.     bclr.b    d1,p_level_param+1(a5)    *clr mark
  8650.     bclr.b    #b_arcc_reset,p_arcc_flg(a4)
  8651.     bra    ckcr2
  8652. ckcr1:
  8653.     btst.b    d1,p_level_param+1(a5)    *check mark
  8654.     bne    next_cmd_md
  8655. ckcr2:
  8656.     lea    __arcc_len(a4),a4
  8657.     subq.l    #1,d1
  8658.     dbra    d2,ckcr0
  8659.     endm
  8660.  
  8661. panpot_md:                *MIDI パンポット絶対指定
  8662.     move.b    (a0)+,d2
  8663. _panpot_md:
  8664.     move.b    d2,p_pan(a5)
  8665.     * ARCC-PANPOTとの競合チェック
  8666.     check_concur    MIDI_PAN
  8667.     bset.b    #pts_panpot,p_timbre_set(a5)
  8668.     bra    next_cmd_md
  8669.  
  8670. rltv_pan_ad:                *ADPCM パンポット相対指定
  8671.     move.b    p_pan(a5),d2
  8672.     bmi    next_cmd_ad        *PAN off時には相対指定無効
  8673.     add.b    (a0)+,d2
  8674.     bpl    _panpot_ad
  8675.     tst.b    -1(a0)
  8676.     bpl    @f
  8677.     moveq.l    #0,d2
  8678.     bra    _panpot_ad
  8679. @@:
  8680.     moveq.l    #127,d2
  8681.     bra    _panpot_md
  8682.  
  8683. panpot_ad:                *ADPCM パンポット絶対指定
  8684.     move.b    (a0)+,d2
  8685. _panpot_ad:
  8686.     move.b    d2,p_pan(a5)
  8687.     bsr    do_adpcm_pan
  8688.     bra    next_cmd_ad
  8689.  
  8690. conv_p@p:
  8691.     * < d2=pan 0-127
  8692.     * > d2=pan 0-3
  8693.     * - all
  8694.     tst.b    d2
  8695.     bmi    cpp_p0
  8696.     cmpi.b    #31,d2        *便宜上4(3)段階パンにする
  8697.     ble    cpp_p1        *0ざとble
  8698.     cmpi.b    #95,d2
  8699.     ble    cpp_p3
  8700. cpp_p2:                *わざとmove.b
  8701.     move.b    #2,d2
  8702.     rts
  8703. cpp_p0:
  8704.     move.b    #0,d2
  8705.     rts
  8706. cpp_p1:
  8707.     move.b    #1,d2
  8708.     rts
  8709. cpp_p3:
  8710.     move.b    #3,d2
  8711.     rts
  8712. *------------------------------------------------------------------------------
  8713. segno_ad:                *ADPCM [segno]
  8714.     bsr    segno_ope
  8715.     bra    next_cmd_ad
  8716.  
  8717. segno_md:                *MIDI [segno]
  8718.     bsr    segno_ope
  8719.     bra    next_cmd_md
  8720.  
  8721. segno_fm:                *FM [segno]
  8722.     pea    next_cmd_fm(pc)
  8723.  
  8724. segno_ope:                *[segno]処理
  8725.     move.b    (a0)+,d0        *get offset(.L)
  8726.     lsl.w    #8,d0
  8727.     move.b    (a0)+,d0
  8728.     swap    d0
  8729.     move.b    (a0)+,d0
  8730.     lsl.w    #8,d0
  8731.     move.b    (a0)+,d0
  8732.     tst.l    d0            *コマンド無視ケース
  8733.     beq    @f
  8734.     tas.b    (a0,d0.l)        *set segno flag
  8735.     bclr.b    #6,(a0,d0.l)        *clr d.s. done flag
  8736. @@:
  8737.     rts
  8738. *------------------------------------------------------------------------------
  8739. ds_ad:                    *ADPCM [d.s.]
  8740.     bsr    ds_ope
  8741.     bra    next_cmd_ad
  8742. ds_md:                    *MIDI [d.s.]
  8743.     bsr    ds_ope
  8744.     bra    next_cmd_md
  8745. ds_fm:                    *FM [d.s.]
  8746.     pea    next_cmd_fm(pc)
  8747.  
  8748. ds_ope:                    *[d.s.]処理([SEGNO]へジャンプ)
  8749.     move.b    (a0),d0            *get flag
  8750.     bpl    exit_dsop        *[segno]がなかったので無視
  8751.     add.b    d0,d0            *check d.s. done flag
  8752.     bmi    exit_dsop        *[d.s.]一度処理したことがあるので無視
  8753.     bset.b    #6,(a0)+        *set d.s. done flag
  8754.     bset.b    #1,p_seq_flag(a5)    *set p_fine_flg
  8755.     move.b    (a0)+,d1        *get offset(.L)
  8756.     lsl.w    #8,d1
  8757.     move.b    (a0)+,d1
  8758.     swap    d1
  8759.     move.b    (a0)+,d1
  8760.     lsl.w    #8,d1
  8761.     move.b    (a0)+,d1
  8762.     cmpi.b    #coda_zmd,(a0)        *直後に[CODA]があるか
  8763.     beq    case_dscoda
  8764.     cmpi.b    #repeat_end_zmd,(a0)    *直後に:|があるか
  8765.     beq    case_dsrepend
  8766. @@:
  8767.     adda.l    d1,a0
  8768.     rts
  8769.  
  8770. case_dsrepend:                *:|が存在する場合
  8771.     cmpi.b    #coda_zmd,5(a0)        *さらにその後ろに[CODA]があるか
  8772.     bne    @b            *ない
  8773.     pea    (a0,d1.l)
  8774.     addq.w    #5,a0
  8775.     bra    @f
  8776.  
  8777. case_dscoda:                *[CODA]が存在する場合
  8778.     pea    (a0,d1.l)
  8779. @@:
  8780.     addq.w    #1,a0
  8781.     bsr    coda_ope
  8782.     move.l    (sp)+,a0
  8783.     rts
  8784.  
  8785. exit_dsop:
  8786.     addq.w    #5,a0
  8787.     rts
  8788. *------------------------------------------------------------------------------
  8789. coda_ad:                *ADPCM [coda]
  8790.     bsr    coda_ope
  8791.     bra    next_cmd_ad
  8792. coda_md:                *MIDI [coda]
  8793.     bsr    coda_ope
  8794.     bra    next_cmd_md
  8795. coda_fm:                *FM [coda]
  8796.     bsr    coda_ope
  8797.     bra    next_cmd_fm
  8798.  
  8799. coda_ope:
  8800.     move.b    (a0)+,d0        *get offset(.L)
  8801.     lsl.w    #8,d0
  8802.     move.b    (a0)+,d0
  8803.     swap    d0
  8804.     move.b    (a0)+,d0
  8805.     lsl.w    #8,d0
  8806.     move.b    (a0)+,d0
  8807.     tas.b    (a0,d0.l)    *set coda flag
  8808.     bclr.b    #6,(a0,d0.l)    *clr tocoda done flag
  8809.     rts
  8810. *------------------------------------------------------------------------------
  8811. tocoda_ad:                *ADPCM [tocoda]
  8812.     bsr    tocoda_ope
  8813.     bra    next_cmd_ad
  8814. tocoda_md:                *MIDI [tocoda]
  8815.     bsr    tocoda_ope
  8816.     bra    next_cmd_md
  8817. tocoda_fm:                *FM [tocoda]
  8818.     pea    next_cmd_fm(pc)
  8819.  
  8820. tocoda_ope:                *[tocoda]処理([coda]へジャンプ)
  8821.     move.b    (a0),d0            *get flag
  8822.     bpl    @f            *[coda]がなかったので無視
  8823.     add.b    d0,d0            *check tocoda done flag
  8824.     bmi    @f            *[tocoda]一度処理したことがあるので無視
  8825.     bset.b    #6,(a0)+        *set tocoda done flag
  8826.     move.b    (a0)+,d0        *get offset(.L)
  8827.     lsl.w    #8,d0
  8828.     move.b    (a0)+,d0
  8829.     swap    d0
  8830.     move.b    (a0)+,d0
  8831.     lsl.w    #8,d0
  8832.     move.b    (a0)+,d0
  8833.     adda.l    d0,a0
  8834.     rts
  8835. @@:
  8836.     addq.w    #5,a0
  8837.     rts
  8838. *------------------------------------------------------------------------------
  8839. fine_fm:                *[fine]処理
  8840.     btst.b    #1,p_seq_flag(a5)    *p_fine_flag
  8841.     beq    next_cmd_fm
  8842.     bra    play_end_fm
  8843.  
  8844. fine_ad:                *[fine]処理
  8845.     btst.b    #1,p_seq_flag(a5)    *p_fine_flag
  8846.     beq    next_cmd_ad
  8847.     bra    play_end_ad
  8848.  
  8849. fine_md:                *[fine]処理
  8850.     btst.b    #1,p_seq_flag(a5)    *p_fine_flag
  8851.     beq    next_cmd_md
  8852.     bra    play_end_md
  8853. *------------------------------------------------------------------------------
  8854. seq_cmd_md:            *MIDI シーケンス特殊コマンド群([~]コマンド群処理)
  8855.     lea    next_cmd_md(pc),a4
  8856.     bra    get_seq_cmd
  8857.  
  8858. seq_cmd_ad:            *ADPCM シーケンス特殊コマンド群([~]コマンド群処理)
  8859.     lea    next_cmd_ad(pc),a4
  8860.     bra    get_seq_cmd
  8861.  
  8862. seq_cmd_fm:            *FM シーケンス特殊コマンド群([~]コマンド群処理)
  8863.     lea    next_cmd_fm(pc),a4
  8864.  
  8865. get_seq_cmd:            *シーケンス特殊コマンドパラメータ処理
  8866.     * > d5.l=return value
  8867.     *    =-1 to play end
  8868.     moveq.l    #0,d0
  8869.     move.b    (a0)+,d0    *seq.cmd no.
  8870.     move.b    (a0)+,d1    *n of params
  8871.     add.w    d0,d0
  8872.     move.w    seq_cmd_tbl(pc,d0.w),d0
  8873.     jmp    seq_cmd_tbl(pc,d0.w)
  8874.  
  8875. seq_cmd_tbl:
  8876.     dc.w    dc_ope-seq_cmd_tbl    *0
  8877.     dc.w    do_ope-seq_cmd_tbl    *1
  8878.     dc.w    jump_ope1-seq_cmd_tbl    *2
  8879.     dc.w    jump_ope2-seq_cmd_tbl    *3
  8880.     dc.w    key_ope-seq_cmd_tbl    *4
  8881.     dc.w    meter_ope-seq_cmd_tbl    *5
  8882.  
  8883. dc_ope:                    *3 [d.c.]処理(初めに帰る)
  8884.     btst.b    #0,p_seq_flag(a5)    *p_dc_flag
  8885.     bne    exit_gsc        *一度処理済み
  8886.     cmpi.b    #coda_zmd,(a0)
  8887.     bne    @f
  8888.     addq.w    #1,a0
  8889.     bsr    coda_ope
  8890. @@:
  8891.     move.l    (a6),a1
  8892.     btst.b    #_ID_SE,p_track_stat(a5)
  8893.     beq    @f
  8894.     move.l    4(a6),a1
  8895. @@:
  8896.     move.w    -(a1),d0
  8897.     bsr    top_ptr_set        *先頭アドレスをセット
  8898.     movea.l    p_data_pointer(a5),a0
  8899.     or.b    #%11,p_seq_flag(a5)    *set p_dc_flag,p_fine_flag
  8900. exit_gsc:
  8901.     jmp    (a4)
  8902.  
  8903. do_ope:                    *[do]処理
  8904.     move.b    #1,p_do_loop_flag(a5)
  8905.     move.l    a0,p_do_loop_ptr(a5)
  8906.     move.l    p_total(a5),p_total_olp(a5)
  8907.     tst.l    jump_flg2-work(a6)    *[@]中だったか
  8908.     bne    @f
  8909.     tst.l    jump_flg3-work(a6)    *[jump]中だったか
  8910.     bne    @f
  8911.     clr.l    p_total(a5)
  8912. @@:
  8913.     jmp    (a4)
  8914.  
  8915. key_ope:
  8916.     btst.b    #_ID_SE,p_track_stat(a5)
  8917.     bne    @f
  8918.     move.b    (a0)+,key+0-work(a6)
  8919.     move.b    (a0)+,key+1-work(a6)
  8920.     jmp    (a4)
  8921. @@:
  8922.     move.b    (a0)+,key_se+0-work(a6)
  8923.     move.b    (a0)+,key_se+1-work(a6)
  8924.     jmp    (a4)
  8925.  
  8926. meter_ope:
  8927.     btst.b    #_ID_SE,p_track_stat(a5)
  8928.     bne    @f
  8929.     move.b    (a0)+,meter+0-work(a6)
  8930.     move.b    (a0)+,meter+1-work(a6)
  8931.     jmp    (a4)
  8932. @@:
  8933.     move.b    (a0)+,meter_se+0-work(a6)
  8934.     move.b    (a0)+,meter_se+1-work(a6)
  8935.     jmp    (a4)
  8936.  
  8937. jump_ope1:                *次の[!]へ飛ぶ
  8938.     tst.l    jump_flg2-work(a6)    *[@]実行中は[!]は無視
  8939.     bne    exit_jo1
  8940.     tst.l    jump_flg3-work(a6)    *[jump nn]実行中は[!]は無視
  8941.     bne    exit_jo1
  8942.     bset.b    #2,p_seq_flag(a5)    *check & set [!]flag
  8943.     bne    end_jump1_mode        *[!]解除へ
  8944.     st.b    jump_flg1-work(a6)
  8945.     lea    jpop_bak(pc),a1
  8946.     move.l    case_key_patch_fm(pc),(a1)+        *パッチする前にバックアップする
  8947.     move.l    case_key_patch_ad(pc),(a1)+
  8948.     move.l    case_key_patch_md(pc),(a1)+
  8949.     move.l    rest_patch_fm(pc),(a1)+
  8950.     move.l    rest_patch_ad(pc),(a1)+
  8951.     move.l    rest_patch_md(pc),(a1)+
  8952.     move.l    wait_patch_fm(pc),(a1)+
  8953.     move.l    wait_patch_ad(pc),(a1)+
  8954.     move.l    wait_patch_md(pc),(a1)+
  8955.     patch_l    BRA,case_key_patch_fm,next_cmd_fm    *発音処理一時無効へ
  8956.     patch_l    BRA,case_key_patch_ad,next_cmd_ad
  8957.     patch_l    BRA,case_key_patch_md,next_cmd_md
  8958.     patch_l    BRA,rest_patch_fm,next_cmd_fm
  8959.     patch_l    BRA,rest_patch_ad,next_cmd_ad
  8960.     patch_l    BRA,rest_patch_md,next_cmd_md
  8961.     patch_l    BRA,wait_patch_fm,next_cmd_fm
  8962.     patch_l    BRA,wait_patch_ad,next_cmd_ad
  8963.     patch_l    BRA,wait_patch_md,next_cmd_md
  8964.     bsr    cache_flush
  8965. exit_jo1:
  8966.     jmp    (a4)
  8967.  
  8968. end_jump1_mode:                *[!]解除
  8969.     bclr.b    #2,p_seq_flag(a5)
  8970.     clr.l    jump_flg1-work(a6)
  8971.     lea    jpop_bak(pc),a1
  8972.     move.l    (a1)+,case_key_patch_fm-work(a6)    *バックアップからパッチデータを戻す
  8973.     move.l    (a1)+,case_key_patch_ad-work(a6)
  8974.     move.l    (a1)+,case_key_patch_md-work(a6)
  8975.     move.l    (a1)+,rest_patch_fm-work(a6)
  8976.     move.l    (a1)+,rest_patch_ad-work(a6)
  8977.     move.l    (a1)+,rest_patch_md-work(a6)
  8978.     move.l    (a1)+,wait_patch_fm-work(a6)
  8979.     move.l    (a1)+,wait_patch_ad-work(a6)
  8980.     move.l    (a1)+,wait_patch_md-work(a6)
  8981.     bsr    cache_flush
  8982.     jmp    (a4)
  8983.  
  8984. jump_ope2:                *次の[@]へ飛ぶ
  8985.     btst.b    #2,p_seq_flag(a5)    *[!]実行中は[@]は無視
  8986.     bne    exit_jo2
  8987.     tst.l    jump_flg3-work(a6)    *[jump nn]実行中は[@]は無視
  8988.     bne    exit_jo2
  8989.     btst.b    #_ID_SE,p_track_stat(a5)    *効果音トラックでは無効
  8990.     bne    exit_jo2
  8991.     move.l    jump_flg2(pc),d0
  8992.     bne    next_jump2_mode        *[@]解除?
  8993.  
  8994.     move.l    (a6),a1            *TRACK ID SET
  8995.     move.w    -(a1),d0
  8996.     bset.l    #31,d0            *最上位ビットが実行中フラグとなる
  8997.     lea.l    jump_flg2(pc),a1
  8998.     move.l    d0,(a1)
  8999. do_patch_jo3:
  9000.     * < d0.l=track id
  9001.     * < a1.l=jump_flgX
  9002.     move.l    a1,jump_flg_ptr-work(a6)    *ジャンプ基準トラックID(jump_flgX)
  9003.     lea    p_total(a5),a1
  9004.     move.l    a1,p_total_ptr-work(a6)        *ジャンプ基準トラックp_total(a5)位置
  9005.  
  9006.     lea    jpop2_bak(pc),a1
  9007.     move.l    case_key_patch_fm(pc),(a1)+        *パッチする前にバックアップする
  9008.     move.l    case_key_patch_ad(pc),(a1)+
  9009.     move.l    case_key_patch_md(pc),(a1)+
  9010.     move.l    rest_patch_fm(pc),(a1)+
  9011.     move.l    rest_patch_ad(pc),(a1)+
  9012.     move.l    rest_patch_md(pc),(a1)+
  9013.     move.l    wait_patch_fm(pc),(a1)+
  9014.     move.l    wait_patch_ad(pc),(a1)+
  9015.     move.l    wait_patch_md(pc),(a1)+
  9016.     patch_l    BRA,case_key_patch_fm,joX1_fm        *発音処理をフック
  9017.     patch_l    BRA,case_key_patch_ad,joX1_ad
  9018.     patch_l    BRA,case_key_patch_md,joX1_md
  9019.     patch_l    BRA,rest_patch_fm,joX1_fm
  9020.     patch_l    BRA,rest_patch_ad,joX1_ad
  9021.     patch_l    BRA,rest_patch_md,joX1_md
  9022.     patch_l    BRA,wait_patch_fm,joX1_fm
  9023.     patch_l    BRA,wait_patch_ad,joX1_ad
  9024.     patch_l    BRA,wait_patch_md,joX1_md
  9025.     bsr    cache_flush
  9026.                     *処理に必要とするワークを初期化
  9027.     move.l    play_trk_tbl(pc),a1    *< d0.l=track ID
  9028.     move.l    seq_wk_tbl(pc),d2
  9029.     btst.b    #_ID_SE,p_track_stat(a5)
  9030.     beq    @f
  9031.     move.l    play_trk_tbl_se(pc),a1    *< d0.l=track ID
  9032.     move.l    seq_wk_tbl_se(pc),d2
  9033. @@:
  9034. *    moveq.l    #0,d3
  9035. 1:
  9036.     moveq.l    #0,d1
  9037.     move.w    (a1)+,d1
  9038.     bmi    exit_jo2
  9039. *    cmp.w    d0,d1
  9040. *    bne    @f
  9041. *    moveq.l    #-1,d3            *ここからさきは演奏順序後ろ
  9042. *@@:
  9043.     swap    d1
  9044.     lsr.l    #16-trwk_size_,d1
  9045.     movea.l    d2,a2
  9046.     adda.l    d1,a2            *a2=trk n seq_wk_tbl
  9047. *    tst.l    d3
  9048. *    beq    @f
  9049. *    clr.l    p_total(a2)        *ワーク初期化
  9050. *    bra    1b
  9051. *@@:                    *[@]が設定されたトラックよりも
  9052.     moveq.l    #0,d1            *演奏順序が前のラックの場合
  9053.     move.w    (a2),d1
  9054.     move.w    #1,(a2)
  9055.     move.l    d1,p_total(a2)
  9056.     bra    1b
  9057.  
  9058. exit_jo2:
  9059.     jmp    (a4)
  9060.                     *第1フェーズ実行部
  9061. joX1_fm:
  9062.     moveq.l    #0,d1
  9063.     move.w    (a5),d1
  9064.     add.l    d1,p_total(a5)
  9065.     bra    next_cmd_fm
  9066.  
  9067. joX1_ad:
  9068.     moveq.l    #0,d1
  9069.     move.w    (a5),d1
  9070.     add.l    d1,p_total(a5)
  9071.     bra    next_cmd_ad
  9072.  
  9073. joX1_md:
  9074.     moveq.l    #0,d1
  9075.     move.w    (a5),d1
  9076.     add.l    d1,p_total(a5)
  9077.     bra    next_cmd_md
  9078.  
  9079. next_jump2_mode:                *[@]次フェーズへ
  9080.     * < d0.l=track id
  9081.     move.l    (a6),a1
  9082.     cmp.w    -(a1),d0            *same track id ?
  9083.     bne    @f
  9084.     patch_w    BSR,mil_patch,check_jump2_tr_id    *トラックIDチェックルーチンへ飛ぶようにパッチ
  9085.     btst.b    #_ID_SE,p_track_stat(a5)
  9086.     beq    jump_next_phase
  9087.     patch_w    BSR,mil_patch_se,check_jump2_tr_id_se
  9088. jump_next_phase:                *第2フェーズ
  9089.     move.l    p_total(a5),d0            *!4/11
  9090.     add.l    d0,zmusic_int-work(a6)        *!
  9091.     patch_l    BRA,case_key_patch_fm,joX2_fm    *発音処理をフック
  9092.     patch_l    BRA,case_key_patch_ad,joX2_ad
  9093.     patch_l    BRA,case_key_patch_md,joX2_md
  9094.     patch_l    BRA,rest_patch_fm,joX2_fm
  9095.     patch_l    BRA,rest_patch_ad,joX2_ad
  9096.     patch_l    BRA,rest_patch_md,joX2_md
  9097.     patch_l    BRA,wait_patch_fm,joX2_fm
  9098.     patch_l    BRA,wait_patch_ad,joX2_ad
  9099.     patch_l    BRA,wait_patch_md,joX2_md
  9100.     bra    cache_flush
  9101. @@:
  9102.     rts
  9103.  
  9104. joX2_fm:
  9105.     lea    next_cmd_fm(pc),a4    *帰還アドレス
  9106. do_joX2:
  9107.     moveq.l    #0,d1
  9108.     move.w    (a5),d1
  9109.     add.l    d1,p_total(a5)
  9110.     move.l    p_total_ptr(pc),a2
  9111.     move.l    (a2),d1
  9112.     cmp.l    p_total(a5),d1
  9113.     bls    @f            *おいついたら
  9114.     jmp    (a4)
  9115. @@:                    *次トラックへ
  9116.     rts
  9117.  
  9118. joX2_ad:
  9119.     lea    next_cmd_ad(pc),a4    *帰還アドレス
  9120.     bra    do_joX2
  9121.  
  9122. joX2_md:
  9123.     lea    next_cmd_md(pc),a4    *帰還アドレス
  9124.     bra    do_joX2
  9125.  
  9126. end_jump3_mode:                    *[jump nn]解除
  9127.     clr.l    jump_flg3-work(a6)
  9128.     bra    @f
  9129.  
  9130. end_jump2_mode:                    *[@]解除
  9131.     clr.l    jump_flg2-work(a6)
  9132. @@:
  9133.     * - d7
  9134.     * p_XX(a5)は使えない
  9135.     * ^^^^^^^^^^^^^^^^^^
  9136. do_end_jumpX_mode    macro    xx
  9137.     lea    jpop2_bak(pc),a1
  9138.     move.l    (a1)+,case_key_patch_fm-work(a6)    *バックアップからパッチデータを戻す
  9139.     move.l    (a1)+,case_key_patch_ad-work(a6)
  9140.     move.l    (a1)+,case_key_patch_md-work(a6)
  9141.     move.l    (a1)+,rest_patch_fm-work(a6)
  9142.     move.l    (a1)+,rest_patch_ad-work(a6)
  9143.     move.l    (a1)+,rest_patch_md-work(a6)
  9144.     move.l    (a1)+,wait_patch_fm-work(a6)
  9145.     move.l    (a1)+,wait_patch_ad-work(a6)
  9146.     move.l    (a1)+,wait_patch_md-work(a6)
  9147.     move.w    #NOP,mil_patch&xx-work(a6)
  9148.     bsr    cache_flush
  9149.                     *使用したワークの後始末
  9150.     move.l    p_total_ptr(pc),a1
  9151.     move.l    (a1),d1
  9152.     move.l    play_trk_tbl&xx(pc),a1
  9153.     move.l    seq_wk_tbl&xx(pc),d2
  9154. @@:
  9155.     moveq.l    #0,d0
  9156.     move.w    (a1)+,d0
  9157.     bmi    @f
  9158.     swap    d0
  9159.     lsr.l    #16-trwk_size_,d0
  9160.     movea.l    d2,a2
  9161.     adda.l    d0,a2            *a2=trk n seq_wk_tbl
  9162.     tst.b    p_track_stat(a2)
  9163.     bne    @b            *アクティブでないならば無視
  9164.     move.l    p_total(a2),d0
  9165.     sub.l    d1,d0            *ステップタイム演算
  9166.     addq.w    #1,d0
  9167.     move.w    d0,(a2)            *store step time
  9168.     bra    @b
  9169. @@:
  9170.     rts
  9171.     endm
  9172.  
  9173.     do_end_jumpX_mode
  9174.  
  9175. end_jump3_mode_se:                *[jump nn]解除
  9176.     clr.l    jump_flg3-work(a6)
  9177.     bra    @f
  9178.  
  9179. end_jump2_mode_se:                *[@]解除
  9180.     clr.l    jump_flg2-work(a6)
  9181. @@:
  9182.     * - d7
  9183.     * p_XX(a5)は使えない
  9184.     * ^^^^^^^^^^^^^^^^^^
  9185. do_end_jumpX_mode    _se
  9186. *------------------------------------------------------------------------------
  9187. jump_ope3_ad:                *ADPCM [jump nn]
  9188.     lea    next_cmd_ad(pc),a4
  9189.     bra    @f
  9190.  
  9191. jump_ope3_md:                *MIDI [jump nn]
  9192.     lea    next_cmd_md(pc),a4
  9193.     bra    @f
  9194.  
  9195. jump_ope3_fm:                *FM [jump nn]
  9196.     lea    next_cmd_fm(pc),a4
  9197. @@:                    *[jump nn]処理
  9198.     btst.b    #2,p_seq_flag(a5)    *[!]実行中は[jump nn]は無視
  9199.     bne    exit_jo3
  9200.     tst.l    jump_flg2-work(a6)    *[@]実行中は[jump nn]は無視
  9201.     bne    exit_jo3
  9202.     tst.l    jump_flg3-work(a6)    *[jump nn]実行中は[jump nn]は無視
  9203.     bne    exit_jo3
  9204.     btst.b    #_ID_SE,p_track_stat(a5)    *効果音トラックでは無効
  9205.     bne    exit_jo3
  9206.  
  9207.     move.l    (a6),a1            *TRACK ID SET
  9208.     moveq.l    #0,d0
  9209.     move.w    -(a1),d0
  9210.     bset.l    #31,d0            *最上位ビットが実行中フラグとなる
  9211.     lea.l    jump_flg3(pc),a1
  9212.     move.l    d0,(a1)
  9213.     move.b    (a0)+,dest_measure+0-work(a6)    *目的小節番号セット
  9214.     move.b    (a0)+,dest_measure+1-work(a6)    *目的小節番号セット
  9215.     move.b    (a0)+,dest_measure+2-work(a6)    *目的小節番号セット
  9216.     move.b    (a0)+,dest_measure+3-work(a6)    *目的小節番号セット
  9217.     bra    do_patch_jo3            *以下[@]の処理と同じ
  9218. exit_jo3:
  9219.     jmp    (a4)
  9220.  
  9221. next_jump3_mode:            *[jump nn]次フェーズへ
  9222.     * < d0.l=track id
  9223.     move.l    (a6),a1
  9224.     cmp.w    -(a1),d0        *same track id ?
  9225.     bne    @f
  9226.     move.l    dest_measure(pc),d0
  9227.     cmp.l    p_measure(a5),d0
  9228.     bne    @f
  9229.     patch_w    BSR,mil_patch,check_jump3_tr_id    *トラックIDチェックルーチンへ飛ぶようにパッチ
  9230.     btst.b    #_ID_SE,p_track_stat(a5)
  9231.     beq    jump_next_phase
  9232.     patch_w    BSR,mil_patch_se,check_jump3_tr_id_se
  9233.     bra    jump_next_phase
  9234. @@:
  9235.     rts
  9236.  
  9237. next_jump3_mode_2:            *[jump nn]次フェーズへ(from 
  9238.     * < d0.l=track id
  9239.     move.l    (a6),a1
  9240.     cmp.w    -(a1),d0        *same track id ?
  9241.     bne    @f
  9242.     patch_w    BSR,mil_patch,check_jump3_tr_id    *トラックIDチェックルーチンへ飛ぶようにパッチ
  9243.     btst.b    #_ID_SE,p_track_stat(a5)
  9244.     beq    jump_next_phase
  9245.     patch_w    BSR,mil_patch_se,check_jump3_tr_id_se
  9246.     bra    jump_next_phase
  9247. @@:
  9248.     rts
  9249. *------------------------------------------------------------------------------
  9250. measure_fm:            *FM 小節線
  9251.     pea    next_cmd_fm(pc)
  9252. do_measure:
  9253.     tst.b    p_vseq_param+p_arcc_sw(a5)
  9254.     beq    1f
  9255.     lea    p_vseq_param(a5),a4        *エンハンスド・ベロシティ・シーケンス処理
  9256.     tst.b    p_arcc_flg(a4)            *b_vseq_msrsync(小節線で同期?)
  9257.     bpl    1f
  9258.     btst.b    #b_arcc_first,p_arcc_flg(a4)
  9259.     beq    @f
  9260.     subq.w    #1,p_arcc_syncnt2(a4)
  9261.     bne    1f
  9262.     bclr.b    #b_arcc_first,p_arcc_flg(a4)
  9263. @@:
  9264.     move.w    p_arcc_syncnt(a4),p_arcc_syncnt2(a4)
  9265.     clr.b    p_arcc_dpt_now(a4)
  9266. 1:
  9267.     btst.b    #b_agogik_trmk,p_agogik_flg(a5)
  9268.     beq    3f
  9269.     move.l    a5,-(sp)
  9270.     move.l    a5,a4
  9271.     lea.l    agogik_base(a6),a5
  9272.     lea    do_agogik(pc),a2
  9273.     btst.b    #_ID_SE,p_track_stat(a4)
  9274.     beq    @f
  9275.     lea.l    agogik_base_se(a6),a5
  9276.     lea    do_agogik_se(pc),a2
  9277. @@:
  9278.     tst.b    p_pmod_sw(a5)
  9279.     beq    2f
  9280.     btst.b    #b_agogik_msrsync,p_agogik_flg(a4)    *小節線同期モードか
  9281.     beq    2f
  9282.     bset.b    #b_pmod_first,p_pmod_flg(a5)
  9283.     beq    @f
  9284.     subq.w    #1,p_pmod_syncnt2(a5)
  9285.     bne    2f
  9286. @@:
  9287.     move.w    p_pmod_syncnt(a5),p_pmod_syncnt2(a5)
  9288.     move.b    #2,p_pmod_chain(a5)        *即接続(つまり同期)
  9289.     moveq.l    #0,d5
  9290.     moveq.l    #0,d6
  9291.     move.l    a2,-(sp)
  9292.     bsr    fm_pmod                *モジュレーションパラメータ
  9293.     move.l    (sp)+,a2
  9294.     jsr    (a2)
  9295. 2:
  9296.     move.l    (sp)+,a5
  9297. 3:
  9298.     addq.l    #1,p_measure(a5)
  9299.     move.l    jump_flg3(pc),d0
  9300.     bne    next_jump3_mode            *小節スキャンジャンプ次フェーズか
  9301.     rts
  9302.  
  9303. measure_ad:            *ADPCM 小節線
  9304.     pea    next_cmd_ad(pc)
  9305.     bra    do_measure
  9306.  
  9307. measure_md:            *MIDI 小節線
  9308.     pea    next_cmd_md(pc)
  9309.     bra    do_measure
  9310. *------------------------------------------------------------------------------
  9311. loop_fm:                *FM    [LOOP]
  9312.     bset.b    #b_loop_done,p_trk_seq_flg(a5)
  9313.     bne    next_cmd_fm
  9314.     bsr    loop_ope
  9315.     beq    play_end_fm
  9316.     bra    next_cmd_fm
  9317.  
  9318. loop_ad:                *ADPCM [LOOP]
  9319.     bset.b    #b_loop_done,p_trk_seq_flg(a5)
  9320.     bne    next_cmd_ad
  9321.     bsr    loop_ope
  9322.     beq    play_end_ad
  9323.     bra    next_cmd_ad
  9324.  
  9325. loop_md:                *MIDI  [LOOP]
  9326.     bset.b    #b_loop_done,p_trk_seq_flg(a5)
  9327.     bne    next_cmd_md
  9328.     bsr    loop_ope
  9329.     beq    play_end_md
  9330.     bra    next_cmd_md
  9331.  
  9332. loop_ope:                *[loop]処理([do]へジャンプ)
  9333.     * eq to_play_end
  9334.     * ne loop
  9335.     move.b    p_do_loop_flag(a5),d1
  9336.     beq    exit_loop_ope        *[do]が省略の場合は演奏終了
  9337.     btst.b    #_ID_SE,p_track_stat(a5)
  9338.     bne    @f
  9339.     bsr    loop_bsr_ope
  9340. @@:
  9341.     addq.b    #1,d1        *inc loop time
  9342.     beq    @b
  9343.     move.b    d1,p_do_loop_flag(a5)
  9344.     btst.b    #2,p_seq_flag(a5)    *[!]中だったか
  9345.     bne    exit_loop_ope
  9346.     clr.b    p_seq_flag(a5)        *ワーク初期化
  9347. @@:
  9348.     move.b    (a0)+,d0
  9349.     lsl.w    #8,d0
  9350.     move.b    (a0)+,d0
  9351.     swap    d0
  9352.     move.b    (a0)+,d0
  9353.     lsl.w    #8,d0
  9354.     move.b    (a0)+,d0        *get offset
  9355.     tst.l    d0
  9356.     beq    @f
  9357.     clr.b    (a0,d0.l)        *ワーク・クリア
  9358.     bra    @b
  9359. @@:
  9360.     move.l    p_do_loop_ptr(a5),a1
  9361.     cmpi.b    #loop_zmd,(a1)        *[do]と[loop]の間に何もない場合は停止
  9362.     beq    exit_loop_ope
  9363.     btst.b    #_ID_SE,p_track_stat(a5)
  9364.     bne    @f
  9365.     tst.b    perform_flg-work(a6)
  9366.     bmi    exit_loop_ope        *FUNC $59(LOOP禁止モードケース)
  9367. @@:
  9368.     move.l    a1,a0
  9369.     moveq.l    #-1,d0
  9370.     rts
  9371. exit_loop_ope:
  9372.     moveq.l    #0,d0
  9373.     rts
  9374.  
  9375. loop_bsr_ope:
  9376.     move.w    obtevtjtbl-work+lp_loop(a6),d0    *1-256ならば指定あり
  9377.     beq    exit_lpo
  9378.     * < d1.b=現在までに繰り返した回数
  9379.     * X d0,d2,a1
  9380.     * - d1は破壊禁止
  9381.     cmp.b    d0,d1            *繰り返し回数チェック
  9382.     bcs    exit_lpo
  9383.     moveq.l    #0,d0
  9384.     move.l    (a6),a1
  9385.     move.w    -(a1),d0        *現在実行中のトラックナンバー(0~)
  9386.     move.l    d0,d2
  9387.     lsr.w    #3,d0            *d0=d0/8
  9388.     move.l    done_bit(pc),a1
  9389.     bset.b    d2,(a1,d0.w)
  9390.     bne    exit_lpo
  9391.     move.l    play_trk_tbl(pc),a1
  9392.     moveq.l    #0,d2
  9393. @@:                    *演奏状態のトラック数のカウント
  9394.     move.w    (a1)+,d0
  9395.     bmi    lbo0
  9396.     addq.w    #1,d2
  9397.     bra    @b
  9398. lbo0:
  9399.     addq.w    #1,obtevtjtbl-work+lp_work(a6)    *今までに何トラックループしたか
  9400.     cmp.w    obtevtjtbl-work+lp_work(a6),d2
  9401.     bhi    exit_lpo
  9402.     movea.l    obtevtjtbl-work+lp_jump(a6),a1
  9403.     clr.l    obtevtjtbl-work+lp_work(a6)    *一度処理したらOFFにする(lp_work=lp_loop=0)
  9404.     jmp    (a1)
  9405. exit_lpo:
  9406.     rts
  9407. *------------------------------------------------------------------------------
  9408. *同様の処理がcalc_totalにもあり
  9409. gosub_fm:                *GOSUB
  9410.     pea    next_cmd_fm(pc)
  9411.  
  9412. do_gosub:
  9413.     moveq.l    #0,d0
  9414.     move.b    (a0)+,d0
  9415.     lsl.w    #8,d0
  9416.     move.b    (a0)+,d0        *get trk number
  9417.     move.b    (a0)+,d1
  9418.     lsl.w    #8,d1
  9419.     move.b    (a0)+,d1
  9420.     swap    d1
  9421.     move.b    (a0)+,d1
  9422.     lsl.w    #8,d1
  9423.     move.b    (a0)+,d1
  9424.     cmpi.w    #-1,d0
  9425.     bne    @f
  9426.     move.l    pattern_trk(pc),a1
  9427.     btst.b    #_ID_SE,p_track_stat(a5)
  9428.     beq    dogsb0
  9429.     move.l    pattern_trk_se(pc),a1
  9430.     bra    dogsb0
  9431. @@:
  9432.     move.l    trk_po_tbl(pc),a1
  9433.     btst.b    #_ID_SE,p_track_stat(a5)
  9434.     beq    @f
  9435.     move.l    trk_po_tbl_se(pc),a1
  9436. @@:
  9437.     lsl.l    #trk_tbl_size_,d0
  9438.     add.l    d0,a1
  9439. dogsb0:
  9440.     move.l    ti_play_data(a1),d0
  9441.     lea    ti_play_data+4(a1,d0.l),a1    *performance data top addr
  9442.     tst.l    p_return(a5)
  9443.     bne    @f
  9444.     move.l    a0,p_return(a5)
  9445.     lea    (a1,d1.l),a0
  9446. @@:
  9447.     rts
  9448.  
  9449. gosub_ad:                *GOSUB
  9450.     bsr    do_gosub
  9451.     bra    next_cmd_ad
  9452.  
  9453. gosub_md:                *GOSUB
  9454.     bsr    do_gosub
  9455.     bra    next_cmd_md
  9456.  
  9457. return_fm:                *return
  9458.     move.l    p_return(a5),d0
  9459.     beq    next_cmd_fm
  9460.     clr.l    p_return(a5)
  9461.     move.l    d0,a0
  9462.     bra    next_cmd_fm
  9463.  
  9464. return_ad:                *return
  9465.     move.l    p_return(a5),d0
  9466.     beq    next_cmd_ad
  9467.     clr.l    p_return(a5)
  9468.     move.l    d0,a0
  9469.     bra    next_cmd_ad
  9470.  
  9471. return_md:                *return
  9472.     move.l    p_return(a5),d0
  9473.     beq    next_cmd_md
  9474.     clr.l    p_return(a5)
  9475.     move.l    d0,a0
  9476.     bra    next_cmd_md
  9477. *------------------------------------------------------------------------------
  9478. event_fm:            *FM イベント制御
  9479.     pea    next_cmd_fm(pc)
  9480.     bra    do_event_ope
  9481.  
  9482. event_ad:            *ADPCM イベント制御
  9483.     pea    next_cmd_ad(pc)
  9484.     bra    do_event_ope
  9485.  
  9486. event_md:            *MIDI イベント制御
  9487.     pea    next_cmd_md(pc)
  9488.  
  9489. do_event_ope:            *イベント制御処理
  9490.     move.b    (a0)+,d1    *(ZMUSIC V3.0自身は
  9491.     lsl.w    #8,d1        *category:WORD,
  9492.     move.b    (a0)+,d1    *class:単なる文字列
  9493.     swap    d1        *のみをサポートする)
  9494.     move.b    (a0)+,d1
  9495.     lsl.w    #8,d1
  9496.     move.b    (a0)+,d1    *get offset
  9497.     tst.b    (a0)        *check category
  9498.     bne    not_just_str_word
  9499.     tst.b    1(a0)        *check class
  9500.     bne    not_just_str_word
  9501.     lea    4(a0),a1
  9502.     move.l    a1,lyric_address-work(a6)    *文字列のアドレスセット
  9503.     tst.l    d1
  9504.     beq    @f
  9505.     add.l    d1,a0                *a0=next
  9506.     subq.l    #4,d1                *属性情報の大きさを除いたものがデータ自身の長さ
  9507.     move.l    d1,lyric_size-work(a6)        *文字列のサイズセット
  9508.     rts
  9509. @@:
  9510.     moveq.l    #-1,d0
  9511.     addq.w    #4,a0        *skip属性サイズ
  9512. @@:
  9513.     addq.l    #1,d0
  9514.     tst.b    (a0)+
  9515.     bne    @b
  9516.     move.l    d0,lyric_size-work(a6)        *文字列のサイズセット
  9517.     rts
  9518. not_just_str_word:
  9519.     tst.l    d1
  9520.     beq    @f
  9521.     add.l    d1,a0
  9522.     rts
  9523. @@:
  9524.     addq.w    #4,a0        *skip属性サイズ
  9525. @@:
  9526.     tst.b    (a0)+
  9527.     bne    @b
  9528.     rts
  9529. *------------------------------------------------------------------------------
  9530. *同様の処理がcalc_totalにもあり
  9531. repeat_start_fm:        *|:n処理
  9532.     addq.w    #2,a0
  9533.     clr.b    (a0)+
  9534.     clr.b    (a0)+
  9535.     bra    next_cmd_fm
  9536.  
  9537. repeat_start_ad:        *|:n処理
  9538.     addq.w    #2,a0
  9539.     clr.b    (a0)+
  9540.     clr.b    (a0)+
  9541.     bra    next_cmd_ad
  9542.  
  9543. repeat_start_md:        *|:n処理
  9544.     addq.w    #2,a0
  9545.     clr.b    (a0)+
  9546.     clr.b    (a0)+
  9547.     bra    next_cmd_md
  9548.  
  9549. repeat_end_ad:            *:|処理
  9550.     bsr    do_repeat_end
  9551.     bra    next_cmd_ad
  9552.  
  9553. repeat_end_md:            *:|処理
  9554.     bsr    do_repeat_end
  9555.     bra    next_cmd_md
  9556.  
  9557. repeat_end_fm:            *:|処理
  9558.     pea    next_cmd_fm(pc)
  9559.  
  9560. do_repeat_end:
  9561.     move.b    (a0)+,d0
  9562.     lsl.w    #8,d0
  9563.     move.b    (a0)+,d0
  9564.     swap    d0
  9565.     move.b    (a0)+,d0
  9566.     lsl.w    #8,d0
  9567.     move.b    (a0)+,d0    *d0.l=offset value
  9568.     move.l    a0,a1
  9569.     suba.l    d0,a0        *a0.l=rept.count
  9570.     move.b    (a0)+,d0
  9571.     lsl.w    #8,d0
  9572.     move.b    (a0)+,d0
  9573.     move.b    (a0)+,d1
  9574.     lsl.w    #8,d1
  9575.     move.b    (a0)+,d1
  9576.     cmp.w    d1,d0        *繰り返し回数とカウンタを比較
  9577.     bne    @f        *リピート
  9578.     move.l    a1,a0        *リピートしないで次へ
  9579.     rts
  9580. @@:
  9581.     addq.w    #1,d1
  9582.     move.b    d1,-1(a0)
  9583.     ror.w    #8,d1
  9584.     move.b    d1,-2(a0)
  9585.     rts
  9586.  
  9587. repeat_skip_ad:            *ADPCM |n処理
  9588.     bsr    repeat_skip
  9589.     bra    next_cmd_ad
  9590.  
  9591. repeat_skip_md:            *MIDI |n処理
  9592.     bsr    repeat_skip
  9593.     bra    next_cmd_md
  9594.  
  9595. repeat_skip_fm:            *FM |n処理
  9596.     pea    next_cmd_fm(pc)
  9597.  
  9598. repeat_skip:            *|n処理
  9599.     move.b    (a0)+,d1
  9600.     lsl.w    #8,d1
  9601.     move.b    (a0)+,d1    *get count
  9602.     move.b    (a0)+,d0
  9603.     lsl.w    #8,d0
  9604.     move.b    (a0)+,d0
  9605.     swap    d0
  9606.     move.b    (a0)+,d0    *get count work offset
  9607.     lsl.w    #8,d0
  9608.     move.b    (a0)+,d0    *d0.w=offset value
  9609.     move.l    a0,a1
  9610.     suba.l    d0,a1
  9611.     move.b    (a1)+,d0
  9612.     lsl.w    #8,d0
  9613.     move.b    (a1)+,d0
  9614.     cmp.w    d0,d1        *count workと比較
  9615.     bne    @f
  9616.     addq.w    #4,a0        *skip offset
  9617.     rts            *|n以降の演奏データを実行する
  9618. @@:                *繰り返し処理から脱ける
  9619.     move.b    (a0)+,d0
  9620.     lsl.w    #8,d0
  9621.     move.b    (a0)+,d0
  9622.     swap    d0
  9623.     move.b    (a0)+,d0
  9624.     lsl.w    #8,d0
  9625.     move.b    (a0)+,d0    *d0=offset
  9626.     adda.l    d0,a0        *オフセットを足して次の|nや:|へ
  9627.     rts
  9628.  
  9629. repeat_skip2_ad:        *ADPCM |処理
  9630.     bsr    do_repeat_skip2
  9631.     bra    next_cmd_ad
  9632.  
  9633. repeat_skip2_md:        *MIDI |処理
  9634.     bsr    do_repeat_skip2
  9635.     bra    next_cmd_md
  9636.  
  9637. repeat_skip2_fm:        *FM |処理
  9638.     pea    next_cmd_fm(pc)
  9639.  
  9640. do_repeat_skip2:            *|処理(nが省略時のケース)
  9641.     move.b    (a0)+,d0
  9642.     lsl.w    #8,d0
  9643.     move.b    (a0)+,d0
  9644.     swap    d0
  9645.     move.b    (a0)+,d0    *get count work offset
  9646.     lsl.w    #8,d0
  9647.     move.b    (a0)+,d0    *d0.l=offset value
  9648.     move.l    a0,a1
  9649.     lea    -2(a0),a1
  9650.     suba.l    d0,a1
  9651.     move.b    (a1)+,d1    *get rept.work
  9652.     lsl.w    #8,d1
  9653.     move.b    (a1)+,d1
  9654.     move.b    (a1)+,d0
  9655.     lsl.w    #8,d0
  9656.     move.b    (a1)+,d0
  9657.     cmp.w    d0,d1        *count workとリピート回数を比較
  9658.     beq    @f
  9659.     addq.w    #4,a0        *skip offset
  9660.     rts            *|以降の演奏データを実行する
  9661. @@:                *リピート最後なので脱ける
  9662.     move.b    (a0)+,d0
  9663.     lsl.w    #8,d0
  9664.     move.b    (a0)+,d0
  9665.     swap    d0
  9666.     move.b    (a0)+,d0
  9667.     lsl.w    #8,d0
  9668.     move.b    (a0)+,d0    *d0=offset
  9669.     adda.l    d0,a0        *オフセットを足して:|へ
  9670.     rts
  9671. *------------------------------------------------------------------------------
  9672. asgn_chg_fm:            *FM チャンネル切り換え
  9673.     move.b    (a0)+,d4    *p_type
  9674.     lsl.w    #8,d4
  9675.     move.b    (a0)+,d4    *p_type
  9676.     tst.w    d4
  9677.     bmi    fm_to_midi
  9678.     bne    fm_to_adpcm
  9679. fm_to_fm:            *以下、FM音源内でのチャンネルチェンジ
  9680.     swap    d4
  9681.     move.b    (a0)+,d4
  9682.     lsl.w    #8,d4
  9683.     move.b    (a0)+,d4
  9684.     move.w    d4,p_ch(a5)
  9685.     bra    next_cmd_fm
  9686.  
  9687. fm_to_adpcm:
  9688.     swap    d4
  9689.     move.b    (a0)+,d4
  9690.     lsl.w    #8,d4
  9691.     move.b    (a0)+,d4
  9692.     move.l    d4,p_type(a5)
  9693.     move.l    #int_play_ope_ad,p_int_play_ope(a5)
  9694.     move.l    #ad_return,(sp)
  9695.     jsr    iw_ad0
  9696.     bra    next_cmd_ad
  9697.  
  9698. asch_tbl0:
  9699.     dc.w    m_out_m0-asch_tbl0
  9700.     dc.w    m_out_m1-asch_tbl0
  9701.     dc.w    m_out_r0-asch_tbl0
  9702.     dc.w    m_out_r1-asch_tbl0
  9703.  
  9704. fm_to_midi:
  9705. adpcm_to_midi:
  9706.     move.w    d4,d1
  9707.     ext.w    d1
  9708.     move.w    d1,p_midi_if(a5)
  9709.     add.w    d1,d1
  9710.     move.w    asch_tbl0(pc,d1.w),d1
  9711.     lea    asch_tbl0(pc,d1.w),a4
  9712.     move.l    a4,p_midi_trans(a5)
  9713.     swap    d4
  9714.     move.b    (a0)+,d4    *p_ch
  9715.     lsl.w    #8,d4
  9716.     move.b    (a0)+,d4    *p_ch
  9717.     move.l    d4,p_type(a5)
  9718.     move.l    #int_play_ope_md,p_int_play_ope(a5)
  9719.     move.w    p_detune(a5),d0
  9720.     ext.l    d0
  9721.     chg64_683    d0
  9722.     move.w    d0,p_detune(a5)
  9723.     move.w    p_bend_dst(a5),d0
  9724.     ext.l    d0
  9725.     chg64_683    d0
  9726.     move.w    d0,p_bend_dst(a5)
  9727.     move.l    #md_return,(sp)
  9728.     jsr    iw_md0
  9729.     bra    next_cmd_md
  9730.  
  9731. asgn_chg_md:            *MIDI チャンネル切り換え
  9732.     move.b    (a0)+,d4    *type
  9733.     lsl.w    #8,d4
  9734.     move.b    (a0)+,d4    *type
  9735.     tst.w    d4
  9736.     beq    midi_to_fm
  9737.     bpl    midi_to_adpcm
  9738. *midi_to_midi:            *以下、MIDI内でのチャンネルチェンジ
  9739.     move.w    d4,d1
  9740.     ext.w    d1
  9741.     move.w    d1,p_midi_if(a5)
  9742.     add.w    d1,d1
  9743.     move.w    asch_tbl1(pc,d1.w),d1
  9744.     lea    asch_tbl1(pc,d1.w),a4
  9745.     move.l    a4,p_midi_trans(a5)
  9746.     swap    d4
  9747.     move.b    (a0)+,d4    *ch
  9748.     lsl.w    #8,d4
  9749.     move.b    (a0)+,d4    *ch
  9750.     move.l    d4,p_type(a5)
  9751.     bra    next_cmd_md
  9752.  
  9753. asch_tbl1:
  9754.     dc.w    m_out_m0-asch_tbl1
  9755.     dc.w    m_out_m1-asch_tbl1
  9756.     dc.w    m_out_r0-asch_tbl1
  9757.     dc.w    m_out_r1-asch_tbl1
  9758.  
  9759. midi_to_fm:
  9760.     swap    d4
  9761.     move.b    (a0)+,d4    *ch
  9762.     lsl.w    #8,d4
  9763.     move.b    (a0)+,d4    *ch
  9764.     move.l    d4,p_type(a5)
  9765.     move.l    #int_play_ope_fm,p_int_play_ope(a5)
  9766.     move.l    opmset_bsr_ms-work(a6),p_opmset(a5)
  9767.     move.w    p_detune(a5),d0
  9768.     muls    #3,d0
  9769.     asr.l    #5,d0
  9770.     move.w    d0,p_detune(a5)
  9771.     move.w    p_bend_dst(a5),d0
  9772.     muls    #3,d0
  9773.     asr.l    #5,d0
  9774.     move.w    d0,p_bend_dst(a5)
  9775.     move.l    #fm_return,(sp)
  9776.     jsr    iw_fm0
  9777.     bra    next_cmd_fm
  9778.  
  9779. midi_to_adpcm:
  9780.     swap    d4
  9781.     move.b    (a0)+,d4
  9782.     lsl.w    #8,d4
  9783.     move.b    (a0)+,d4
  9784.     move.l    d4,p_type(a5)
  9785.     move.l    #int_play_ope_ad,p_int_play_ope(a5)
  9786.     move.w    p_detune(a5),d0
  9787.     muls    #3,d0
  9788.     asr.l    #5,d0
  9789.     move.w    d0,p_detune(a5)
  9790.     move.w    p_bend_dst(a5),d0
  9791.     muls    #3,d0
  9792.     asr.l    #5,d0
  9793.     move.w    d0,p_bend_dst(a5)
  9794.     move.l    #ad_return,(sp)
  9795.     jsr    iw_ad0
  9796.     bra    next_cmd_ad
  9797.  
  9798. asgn_chg_ad:            *ADPCM チャンネル切り換え
  9799.     move.b    (a0)+,d4    *type
  9800.     lsl.w    #8,d4
  9801.     move.b    (a0)+,d4    *type
  9802.     tst.w    d4
  9803.     bmi    adpcm_to_midi
  9804.     beq    adpcm_to_fm
  9805. adpcm_to_adpcm:
  9806.     swap    d4
  9807.     move.b    (a0)+,d4    *ch
  9808.     lsl.w    #8,d4
  9809.     move.b    (a0)+,d4    *ch
  9810.     move.w    d4,p_ch(a5)
  9811.     bra    next_cmd_ad
  9812.  
  9813. adpcm_to_fm:
  9814.     swap    d4
  9815.     move.b    (a0)+,d4
  9816.     lsl.w    #8,d4
  9817.     move.b    (a0)+,d4
  9818.     move.l    d4,p_type(a5)
  9819.     move.l    #int_play_ope_fm,p_int_play_ope(a5)
  9820.     move.l    opmset_bsr_ms-work(a6),p_opmset(a5)
  9821.     move.l    #fm_return,(sp)
  9822.     jsr    iw_fm0
  9823.     bra    next_cmd_fm
  9824. *------------------------------------------------------------------------------
  9825. ch_pressure_md:            *チャンネルプレッシャー
  9826.     move.b    (a0)+,d1
  9827.     moveq.l    #$d0,d0            *ch pressure
  9828.     add.b    d4,d0
  9829.     move.l    p_midi_trans(a5),a2
  9830.     jsr    (a2)
  9831.     move.b    d1,d0            *velocity
  9832.     jsr    (a2)
  9833.     bra    next_cmd_md
  9834.  
  9835. rltv_ch_pressure_md:            *相対チャンネルプレッシャー
  9836.     move.b    (a0)+,d1
  9837.     add.b    p_velo(a5),d1        *相対値を加算するが結果は1回限りの使い捨て
  9838.     bpl    @f
  9839.     tst.b    -1(a0)
  9840.     bmi    cprm_vlzr
  9841.     moveq.l    #127,d1
  9842.     bra    @f
  9843. cprm_vlzr:
  9844.     moveq.l    #0,d1
  9845. @@:
  9846.     moveq.l    #$d0,d0            *ch pressure
  9847.     add.b    d4,d0
  9848.     move.l    p_midi_trans(a5),a2
  9849.     jsr    (a2)
  9850.     move.b    d1,d0            *velocity
  9851.     jsr    (a2)
  9852.     bra    next_cmd_md
  9853. *------------------------------------------------------------------------------
  9854. polyphonic_pressure_fm:        *ポリフォニックプレッシャー
  9855.     move.w    p_voice_rsv(a5),d1    *loop counter
  9856.     lea    p_note(a5),a1
  9857.     move.b    (a0)+,d7    *get note.b
  9858.     bmi    @f        *相対指定のケース
  9859.     move.b    (a0)+,d0
  9860.     bsr    getset_vol2
  9861. *    tst.w    p_level_param(a5)
  9862. *    bne    next_cmd_fm
  9863. *    move.w    #4,p_level_param(a5)
  9864.     or.w    #$0100,p_level_param(a5)    *!5/28
  9865.     bra    next_cmd_fm
  9866. @@:
  9867.     andi.w    #$7f,d7
  9868.     move.b    (a0)+,d0
  9869.     bsr    getset_vol3
  9870. *    tst.w    p_level_param(a5)
  9871. *    bne    next_cmd_fm
  9872. *    move.w    #4,p_level_param(a5)
  9873.     or.w    #$0100,p_level_param(a5)    *!5/28
  9874.     bra    next_cmd_fm
  9875.  
  9876. polyphonic_pressure_ad:        *ポリフォニックプレッシャー
  9877.     move.w    p_voice_rsv(a5),d1    *loop counter
  9878.     lea    p_note(a5),a1
  9879.     move.b    (a0)+,d7    *get note.b
  9880.     bmi    @f        *相対指定のケース
  9881.     move.b    (a0)+,d0
  9882.     bsr    getset_vol2
  9883. *    tst.w    p_level_param(a5)
  9884. *    bne    next_cmd_ad
  9885. *    move.w    #4,p_level_param(a5)
  9886.     or.w    #$0100,p_level_param(a5)    *!5/28
  9887.     bra    next_cmd_ad
  9888. @@:
  9889.     andi.w    #$7f,d7
  9890.     move.b    (a0)+,d0
  9891.     bsr    getset_vol3
  9892. *    tst.w    p_level_param(a5)
  9893. *    bne    next_cmd_ad
  9894. *    move.w    #4,p_level_param(a5)
  9895.     or.w    #$0100,p_level_param(a5)    *!5/28
  9896.     bra    next_cmd_ad
  9897.  
  9898. getset_vol2:                *音量値をノートワークにもセット
  9899.     * < d7.b=key note number
  9900.     * < d0=volume value 0-127
  9901.     * X d0-d1/a1
  9902. gsvlp02:
  9903.     cmp.b    (a1),d7
  9904.     bne    gstv2_0
  9905.     tst.b    k_velo(a1)
  9906.     bmi    @f
  9907.     move.b    d0,k_velo(a1)
  9908.     rts
  9909. @@:
  9910.     tas.b    d0
  9911.     move.b    d0,k_velo(a1)
  9912.     rts
  9913. gstv2_0:
  9914.     addq.w    #k_note_len,a1
  9915.     dbra    d1,gsvlp02
  9916.     rts
  9917.  
  9918. getset_vol3:                *音量値をノートワークにもセット(相対PLUS)
  9919.     * < d7.b=key note number
  9920.     * < d0=volume value +127
  9921.     * X d0-d1/a1
  9922. gsvlp03:
  9923.     cmp.b    (a1),d7
  9924.     bne    gstv3_0
  9925.     tst.b    k_velo(a1)        *そこで打ち止め
  9926.     bmi    @f
  9927. do_gsv3:
  9928.     add.b    d0,k_velo(a1)
  9929.     bpl    exit_gsv3
  9930.     bcs    gsv_vlzr
  9931.     move.b    #127,k_velo(a1)
  9932. exit_gsv3:
  9933.     rts
  9934. gsv_vlzr:
  9935.     clr.b    k_velo(a1)
  9936.     rts
  9937. @@:
  9938.     andi.b    #$7f,k_velo(a1)
  9939.     bsr    do_gsv3
  9940.     tas.b    k_velo(a1)
  9941.     rts
  9942. gstv3_0:
  9943.     addq.w    #k_note_len,a1
  9944.     dbra    d1,gsvlp03
  9945.     rts
  9946.  
  9947. polyphonic_pressure_md:        *ポリフォニックプレッシャー
  9948.     moveq.l    #max_note_on-1,d2
  9949.     lea    p_note(a5),a1
  9950.     move.l    p_midi_trans(a5),a2
  9951.     move.b    (a0)+,d7    *get note.b
  9952.     bmi    ppm_rltv    *相対指定のケース
  9953.     move.b    (a0)+,d1
  9954. ppm_lp00:                *絶対指定
  9955.     move.b    (a1),d0
  9956.     bmi    1f
  9957.     cmp.b    d7,d0
  9958.     beq    @f
  9959.     addq.w    #k_note_len,a1
  9960.     dbra    d2,ppm_lp00
  9961.     bra    next_cmd_md
  9962. @@:
  9963.     move.b    d1,k_velo(a1)
  9964. 1:
  9965.     moveq.l    #$a0,d0            *polyphonic pressure
  9966.     add.b    d4,d0
  9967.     jsr    (a2)
  9968.     move.b    d7,d0
  9969.     jsr    (a2)
  9970.     move.b    d1,d0            *velocity
  9971.     jsr    (a2)
  9972.     bra    next_cmd_md
  9973. ppm_rltv:                *相対指定
  9974.     andi.w    #$7f,d7
  9975.     move.b    (a0)+,d1
  9976. ppm_lp01:                *相対指定(PLUS)
  9977.     move.b    (a1),d0
  9978.     bmi    next_cmd_md
  9979.     cmp.b    d7,d0
  9980.     bne    ppm01_next
  9981.     add.b    k_velo(a1),d1
  9982.     bpl    @f
  9983.     tst.b    -1(a0)
  9984.     bmi    ppm01_vlzr
  9985.     moveq.l    #127,d1
  9986.     bra    @f
  9987. ppm01_vlzr:
  9988.     moveq.l    #0,d1
  9989. @@:
  9990.     move.b    d1,k_velo(a1)
  9991.     moveq.l    #$a0,d0            *polyphonic pressure
  9992.     add.b    d4,d0
  9993.     jsr    (a2)
  9994.     move.b    d7,d0
  9995.     jsr    (a2)
  9996.     move.b    d1,d0            *velocity
  9997.     jsr    (a2)
  9998.     bra    next_cmd_md
  9999. ppm01_next:
  10000.     addq.w    #k_note_len,a1
  10001.     dbra    d2,ppm_lp01
  10002.     bra    next_cmd_md
  10003. *------------------------------------------------------------------------------
  10004. rltv_velo_md:            *MIDI 相対ベロシティ
  10005.     move.b    p_velo16(a5),d0
  10006.     bpl    rltv_velo16
  10007.     move.b    p_velo(a5),d0
  10008.     add.b    (a0)+,d0
  10009.     bpl    st_rvm
  10010.     tst.b    -1(a0)
  10011.     bmi    @f        *case:minus value
  10012.     moveq.l    #127,d0
  10013.     bra    st_rvm
  10014. @@:
  10015.     moveq.l    #0,d0
  10016. st_rvm:
  10017.     move.b    d0,p_velo(a5)
  10018.     bra    next_cmd_md
  10019.  
  10020. rltv_vol2_fm:            *FM 相対ボリューム
  10021.     move.b    p_vol16(a5),d0
  10022.     bpl    rltv_vol16_fm
  10023. rltv_ch_pressure_fm:        *相対チャンネルプレッシャー
  10024. rltv_velo_fm:            *FM 相対ベロシティ
  10025. rltv_vol_fm:            *FM 相対ボリューム
  10026.     move.b    p_vol(a5),d0
  10027.     add.b    (a0)+,d0
  10028.     bpl    _volume_fm
  10029.     tst.b    -1(a0)
  10030.     bmi    @f        *case:minus value
  10031.     moveq.l    #127,d0
  10032.     bra    _volume_fm
  10033. @@:
  10034.     moveq.l    #0,d0
  10035.     bra    _volume_fm
  10036.  
  10037. rltv_vol16_fm:            *FM 相対ボリューム(16段階)
  10038.     add.b    (a0)+,d0
  10039.     cmpi.b    #16,d0
  10040.     bls    cnv_l127_fm
  10041.     tst.b    -1(a0)
  10042.     bmi    @f
  10043.     moveq.l    #16,d0
  10044.     bra    cnv_l127_fm
  10045. @@:
  10046.     moveq.l    #0,d0
  10047. cnv_l127_fm:
  10048.     move.b    d0,p_vol16(a5)
  10049.     ext.w    d0
  10050.     move.b    vol_tbl(pc,d0.w),d0
  10051.     bra    _volume_fm
  10052.  
  10053. vol_tbl:    *0 1  2  3  4  5  6   7   8   9   10  11  12  13  14  15  16
  10054.     dc.b    85,87,90,93,95,98,101,103,106,109,111,114,117,119,122,125,127
  10055.     .even
  10056.  
  10057. ch_pressure_fm:            *チャンネルプレッシャー
  10058. velocity_fm:            *ベロシティ設定
  10059. volume_fm:            *FM音量設定
  10060.     move.b    (a0)+,d0
  10061.     bpl    @f
  10062.     andi.w    #$7f,d0        *FM 16段階音量指定
  10063.     move.b    d0,p_vol16(a5)
  10064.     move.b    vol_tbl(pc,d0.w),d0
  10065.     bra    _volume_fm
  10066. @@:
  10067.     st.b    p_vol16(a5)
  10068. _volume_fm:
  10069.     move.b    d0,p_velo(a5)    *FMではvelo=vol
  10070.     bsr    getset_vol
  10071. *    tst.w    p_level_param(a5)
  10072. *    bne    next_cmd_fm
  10073. *    move.w    #4,p_level_param(a5)
  10074.     or.w    #$0100,p_level_param(a5)    *!5/28
  10075.     bra    next_cmd_fm
  10076.  
  10077. rltv_vol2_ad:            *ADPCM 相対ボリューム
  10078.     move.b    p_vol16(a5),d0
  10079.     bpl    rltv_vol16_ad
  10080. rltv_ch_pressure_ad:        *相対チャンネルプレッシャー
  10081. rltv_velo_ad:            *ADPCM 相対ベロシティ
  10082. rltv_vol_ad:            *ADPCM 相対ボリューム
  10083.     move.b    p_vol(a5),d0
  10084.     add.b    (a0)+,d0
  10085.     bpl    _volume_ad
  10086.     tst.b    -1(a0)
  10087.     bmi    @f        *case:minus value
  10088.     moveq.l    #127,d0
  10089.     bra    _volume_ad
  10090. @@:
  10091.     moveq.l    #0,d0
  10092.     bra    _volume_ad
  10093.  
  10094. ch_pressure_ad:            *チャンネルプレッシャー
  10095. velocity_ad:            *ADPCMベロシティ設定
  10096. volume_ad:            *ADPCM音量設定
  10097.     move.b    (a0)+,d0
  10098.     bpl    @f
  10099.     bsr    get_vol16    *ADPCM 16段階音量指定
  10100.     bra    _volume_ad
  10101. @@:
  10102.     st.b    p_vol16(a5)
  10103. _volume_ad:
  10104.     move.b    d0,p_velo(a5)    *ADPCMではvelo=vol
  10105.     bsr    getset_vol
  10106. *    tst.w    p_level_param(a5)
  10107. *    bne    next_cmd_ad
  10108. *    move.w    #4,p_level_param(a5)
  10109.     or.w    #$0100,p_level_param(a5)    *!5/28
  10110.     bra    next_cmd_ad
  10111.  
  10112. getset_vol:                *音量値を取り出してノートワークにもセット
  10113.     * < volume value 0-127
  10114.     * X d0-d1/a1
  10115.     move.b    d0,p_vol(a5)        *0-127
  10116.     move.w    p_voice_rsv(a5),d1    *loop counter
  10117.     lea    p_note+k_velo(a5),a1
  10118. gsvlp:
  10119.     tst.b    (a1)            *そこで打ち止め
  10120.     bmi    @f
  10121.     move.b    d0,(a1)
  10122.     addq.w    #k_note_len,a1
  10123.     dbra    d1,gsvlp
  10124.     rts
  10125. @@:
  10126.     move.b    d0,(a1)
  10127.     tas.b    (a1)
  10128.     addq.w    #k_note_len,a1
  10129.     dbra    d1,gsvlp
  10130.     rts
  10131.  
  10132. rltv_vol2_md:            *MIDI 相対ボリューム
  10133.     move.b    p_vol16(a5),d0
  10134.     bpl    rltv_vol16_md
  10135. rltv_vol_md:            *MIDI 相対ボリューム
  10136.     move.b    p_vol(a5),d0
  10137.     add.b    (a0)+,d0
  10138.     bpl    _volume_md
  10139.     tst.b    -1(a0)
  10140.     bmi    @f        *case:minus value
  10141.     moveq.l    #127,d0
  10142.     bra    _volume_md
  10143. @@:
  10144.     moveq.l    #0,d0
  10145.     bra    _volume_md
  10146.  
  10147. rltv_vol16_md:            *16段階指定
  10148.     add.b    (a0)+,d0
  10149.     cmpi.b    #16,d0
  10150.     bls    cnv_l127md
  10151.     tst.b    -1(a0)
  10152.     bmi    @f
  10153.     moveq.l    #16,d0
  10154.     bra    cnv_l127md
  10155. @@:
  10156.     moveq.l    #0,d0
  10157. cnv_l127md:
  10158.     move.b    d0,p_vol16(a5)
  10159.     ext.w    d0
  10160.     move.b    vol_tbl2(pc,d0.w),d0
  10161.     bra    _volume_md
  10162.  
  10163. rltv_velo16:            *16段階指定
  10164.     add.b    (a0)+,d0
  10165.     cmpi.b    #16,d0
  10166.     bls    cnvel_l127
  10167.     tst.b    -1(a0)
  10168.     bmi    @f
  10169.     moveq.l    #16,d0
  10170.     bra    cnvel_l127
  10171. @@:
  10172.     moveq.l    #0,d0
  10173. cnvel_l127
  10174.     move.b    d0,p_velo16(a5)
  10175.     ext.w    d0
  10176.     move.b    vol_tbl2(pc,d0.w),p_velo(a5)
  10177.     bra    next_cmd_md
  10178.  
  10179. vol_tbl2:    *    0 1  2  3  4  5  6  7  8  9 10 11 12  13  14  15  16
  10180. *    dc.b        0,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119,127
  10181.     dc.b        0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,127
  10182.     .even
  10183.  
  10184. rltv_vol16_ad:            *16段階指定
  10185.     add.b    (a0)+,d0
  10186.     cmpi.b    #16,d0
  10187.     bls    cnv_l127ad
  10188.     tst.b    -1(a0)
  10189.     bmi    @f
  10190.     moveq.l    #16,d0
  10191.     bra    cnv_l127ad
  10192. @@:
  10193.     moveq.l    #0,d0
  10194. cnv_l127ad:
  10195.     move.b    d0,p_vol16(a5)
  10196.     ext.w    d0
  10197.     move.b    vol_tbl2(pc,d0.w),d0
  10198.     bra    _volume_ad
  10199.  
  10200. velocity_md:            *MIDIベロシティ設定
  10201.     move.b    (a0)+,d0
  10202.     bpl    @f
  10203.     andi.w    #$7f,d0
  10204.     move.b    d0,p_velo16(a5)
  10205.     move.b    vol_tbl2(pc,d0.w),p_velo(a5)    *0-127
  10206.     bra    next_cmd_md
  10207. @@:
  10208.     st.b    p_velo16(a5)
  10209.     move.b    d0,p_velo(a5)    *0-127
  10210.     bra    next_cmd_md
  10211.  
  10212. volume16_md:            *MIDI 16段階音量指定
  10213.     pea    _volume_md(pc)
  10214.  
  10215. get_vol16:
  10216.     andi.w    #$7f,d0
  10217.     move.b    d0,p_vol16(a5)
  10218.     move.b    vol_tbl2(pc,d0.w),d0
  10219.     rts
  10220.  
  10221. volume_md:            *MIDI音量設定
  10222.     move.b    (a0)+,d0
  10223.     bmi    volume16_md
  10224.     st.b    p_vol16(a5)
  10225. _volume_md:
  10226.     move.b    d0,p_vol(a5)    *0-127
  10227.     check_concur    MIDI_VOL
  10228.     bset.b    #pts_volume,p_timbre_set(a5)    *音量設定フラグオン
  10229.     bra    next_cmd_md
  10230.  
  10231. do_md_volume    macro    xx
  10232.     * < d1.b=0-127
  10233.     * < d4.w=ch
  10234.     * X d0-d1,a4
  10235.     moveq.l    #$b0,d0
  10236.     or.b    d4,d0
  10237.     bsr    xx
  10238.     moveq.l    #MIDI_VOL,d0
  10239.     bsr    xx
  10240.     move.b    d1,d0
  10241.     bra    xx
  10242.     endm
  10243.  
  10244. do_md_volume_m0:    do_md_volume    m_out_m0
  10245. do_md_volume_m1:    do_md_volume    m_out_m1
  10246. do_md_volume_r0:    do_md_volume    m_out_r0
  10247. do_md_volume_r1:    do_md_volume    m_out_r1
  10248.  
  10249. do_fm_volume_fdr:            *FADER処理系の時はここへエントリ
  10250.     * < d0=127-volume
  10251.     * < d4=fm ch
  10252.     * - d0
  10253.     * X d1,d2,a4
  10254.     move.b    cf-work(a6,d4.w),d1
  10255.     swap    d1
  10256.     move.w    #$60,d1
  10257.     or.b    d4,d1
  10258.  
  10259.     btst.l    #0+16,d1
  10260.     beq    2f
  10261.     move.l    d0,-(sp)
  10262.     move.b    ol1-work(a6,d4.w),d2    *OP1
  10263.     bsr    consider_fader_fm
  10264.     add.b    d0,d2
  10265.     bpl    @f
  10266.     moveq.l    #127,d2
  10267. @@:
  10268.     jsr    (a4)            *opmset
  10269.     move.l    (sp)+,d0
  10270. 2:
  10271.     addq.b    #8,d1
  10272.     btst.l    #2+16,d1
  10273.     beq    2f
  10274.     move.l    d0,-(sp)
  10275.     move.b    ol3-work(a6,d4.w),d2    *OP3
  10276.     bsr    consider_fader_fm
  10277.     add.b    d0,d2
  10278.     bpl    @f
  10279.     moveq.l    #127,d2
  10280. @@:
  10281.     jsr    (a4)
  10282.     move.l    (sp)+,d0
  10283. 2:
  10284.     addq.b    #8,d1
  10285.     btst.l    #1+16,d1
  10286.     beq    2f
  10287.     move.l    d0,-(sp)
  10288.     move.b    ol2-work(a6,d4.w),d2    *OP2
  10289.     bsr    consider_fader_fm
  10290.     add.b    d0,d2
  10291.     bpl    @f
  10292.     moveq.l    #127,d2
  10293. @@:
  10294.     jsr    (a4)            *opmset
  10295.     move.l    (sp)+,d0
  10296. 2:
  10297.     addq.b    #8,d1
  10298.     move.l    d0,-(sp)
  10299.     move.b    ol4-work(a6,d4.w),d2    *OP4
  10300.     cmpi.w    #7,d4
  10301.     bne    @f
  10302.     tst.b    $0f+opmreg(a6)
  10303.     bpl    @f
  10304.     bsr    consider_fader_fm_n
  10305.     bra    1f
  10306. @@:
  10307.     bsr    consider_fader_fm
  10308. 1:
  10309.     add.b    d0,d2
  10310.     bpl    @f
  10311.     moveq.l    #127,d2
  10312. @@:
  10313.     jsr    (a4)            *opmset
  10314.     move.l    (sp)+,d0
  10315.     rts
  10316.  
  10317. _do_ad_volume:            *フェーダー考慮付きADPCM音量設定
  10318.     * < d0=0-127
  10319.     * < d4=ad ch(0-15)
  10320.     bsr    consider_fader_ad
  10321. do_ad_volume:            *ADPCM音量設定
  10322.     * < d0=0-127
  10323.     * < d4=ad ch(0-15)
  10324.     * X d0,d1
  10325.     move.l    d0,d1
  10326. do_ad_volume_:            *単声モード時はパッチ(rts)が当たる
  10327.     move.w    #M_SET_VOL,d0
  10328.     move.b    d4,d0
  10329.     MPCM_call
  10330.     rts
  10331. *------------------------------------------------------------------------------
  10332. do_kn_fm    macro    mode
  10333.     * < d4.l=type,ch        *mode=1:ms_key_off_fmから参照されている
  10334.     * - a4
  10335.     * x d0
  10336. reglist    reg    d1-d3/d6/a1/a4
  10337.     local    fko_lp_f,exit_kn_fm
  10338.     .if    (mode=0)
  10339.     tst.b    p_how_many(a5)
  10340.     bmi    exit_kn_fm        *already all off
  10341.     .endif
  10342.     movem.l    reglist,-(sp)
  10343.     move.w    p_voice_rsv(a5),d6    *loop counter
  10344.     lea    p_note(a5),a1
  10345.     .if    (mode=0)
  10346.     tst.b    p_track_mode(a5)
  10347.     bmi    _case_nof2_fm
  10348.     .endif
  10349.     move.w    d4,d0
  10350.     move.l    p_opmset(a5),a4
  10351. fko_lp_f:
  10352.     tas.b    (a1)                *note.b
  10353.     .if    (mode=0)
  10354.     bmi    @f
  10355.     .endif
  10356.     moveq.l    #8,d1                *FM reg. number
  10357.     move.b    opm_kon-work(a6,d0.w),d2
  10358.     and.b    opm_nom-work(a6,d0.w),d2
  10359.     jsr    (a4)                *opmset(FM key off)
  10360.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  10361. @@:
  10362.     .if    (mode)
  10363.     move.w    sr,-(sp)
  10364.     ori.w    #$0700,sr
  10365.  
  10366.     move.w    #$e0,d1                *わざとmove.w
  10367.     add.b    d0,d1
  10368.     moveq.l    #$ff,d2
  10369.     moveq.l    #4-1,d3
  10370. 1:
  10371.     move.b    opmreg(a6,d1.w),-(sp)
  10372.     jsr    (a4)                *1DL=RR=15
  10373.     move.b    (sp)+,opmreg(a6,d1.w)
  10374.     addq.w    #8,d1
  10375.     dbra    d3,1b
  10376.  
  10377. *    moveq.l    #$20,d1                *AF
  10378. *    add.b    d0,d1
  10379. *    move.b    opmreg(a6,d1.w),d2
  10380. *    move.b    d2,d3
  10381. *    andi.w    #%0011_1111,d2
  10382. *    jsr    (a4)                *PAN Off
  10383. *    move.b    d3,opmreg(a6,d1.w)
  10384.     move.w    (sp)+,sr
  10385.     .endif
  10386.  
  10387.     addq.w    #k_note_len,a1
  10388.     addq.w    #1,d0
  10389.     andi.w    #7,d0
  10390.     dbra    d6,fko_lp_f
  10391.     st.b    p_how_many(a5)        all key off
  10392.     movem.l    (sp)+,reglist
  10393. exit_kn_fm:
  10394.     rts
  10395.  
  10396.     .if    (mode=0)
  10397. _case_nof2_fm:
  10398.     * < a1.l=p_note
  10399.     * < d6.l=loop counter
  10400. @@:
  10401.     ori.l    #$8000,(a1)+
  10402.     dbra    d6,@b
  10403.     st.b    p_how_many(a5)
  10404.     movem.l    (sp)+,reglist
  10405.     rts
  10406.     .endif
  10407.     endm
  10408.  
  10409. do_kn_ad    macro    mode
  10410.     * < d4.l=type,ch        *mode=1:ms_key_off_adから参照されている
  10411.     * x d0
  10412. reglist    reg    d1-d2/d5-d6/a1
  10413.     local    fko_lp_a,exit_kn_ad
  10414.     .if    (mode=0)
  10415.     tst.b    p_how_many(a5)
  10416.     bmi    exit_kn_ad        *already all off
  10417.     .endif
  10418.     movem.l    reglist,-(sp)
  10419.     move.w    p_voice_rsv(a5),d6    *loop counter
  10420.     lea    p_note(a5),a1
  10421.     .if    (mode=0)
  10422.     tst.b    p_track_mode(a5)
  10423.     bmi    _case_nof2_ad
  10424.     .endif
  10425.     moveq.l    #0,d5
  10426.     move.b    d4,d5
  10427. fko_lp_a:
  10428.     tas.b    (a1)            *note.b
  10429.     .if    (mode=0)
  10430.     bmi    @f
  10431.     .endif
  10432.     move.l    d5,d0
  10433.     bsr    pcm_key_off
  10434.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  10435. @@:
  10436.     addq.w    #k_note_len,a1
  10437.     addq.b    #1,d5
  10438.     andi.b    #$0f,d5
  10439.     dbra    d6,fko_lp_a
  10440.     st.b    p_how_many(a5)
  10441.     movem.l    (sp)+,reglist
  10442. exit_kn_ad:
  10443.     rts
  10444.  
  10445.     .if    (mode=0)
  10446. _case_nof2_ad:
  10447.     * < a1.l=p_note
  10448.     * < d6.l=loop counter
  10449. @@:
  10450.     ori.l    #$8000,(a1)+
  10451.     dbra    d6,@b
  10452.     st.b    p_how_many(a5)
  10453.     movem.l    (sp)+,reglist
  10454.     rts
  10455.     .endif
  10456.     .endm
  10457.  
  10458. do_kn_md    macro    mode
  10459.     * < d4.l=type,ch        *mode=1:ms_key_off_mdから参照されている
  10460.     * x d0,a2,a4
  10461. reglist    reg    d1-d2/d6/a1
  10462.     local    fko_lp_m
  10463.     .if    (mode=0)
  10464.     tst.b    p_track_mode(a5)
  10465.     bmi    _case_nof2_md
  10466.     .endif
  10467.     movem.l    reglist,-(sp)
  10468.     moveq.l    #max_note_on-1,d6    *max note on
  10469.     lea    p_note(a5),a1
  10470.     move.l    p_midi_trans(a5),a2
  10471.     .if    (mode)
  10472.     move.b    (a1),d1
  10473.     bpl    1f
  10474.     moveq.l    #$b0,d0
  10475.     add.b    d4,d0
  10476.     jsr    (a2)            *send cmd
  10477.     moveq.l    #$78,d0
  10478.     jsr    (a2)
  10479.     moveq.l    #$00,d0
  10480.     jsr    (a2)            *all sound off
  10481.     movem.l    (sp)+,reglist
  10482.     rts
  10483.     .endif
  10484. fko_lp_m:
  10485.     move.b    (a1),d1            *note
  10486.     bmi    @f            *exit
  10487. 1:
  10488.     moveq.l    #$90,d0
  10489.     add.b    d4,d0
  10490.     jsr    (a2)            *send cmd
  10491.     move.b    d1,d0
  10492.     jsr    (a2)            *note number
  10493.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  10494.     moveq.l    #$00,d0
  10495.     jsr    (a2)            *#0
  10496.     move.l    #-1,(a1)+
  10497.     dbra    d6,fko_lp_m
  10498. @@:
  10499.     movem.l    (sp)+,reglist
  10500.     rts
  10501.  
  10502.     .if    (mode=0)
  10503. _case_nof2_md:
  10504.     move.w    #-1,p_note(a5)        *すべて殺したことを記す
  10505.     rts
  10506.     .endif
  10507.     .endm
  10508.  
  10509. kill_note_fm:
  10510.     move.b    (a0)+,d1
  10511.     bmi    knm_m_stop_all
  10512.     beq    @f
  10513.     bsr    do_kn_fm
  10514.     cmpi.b    #2,d1
  10515.     bne    next_cmd_fm
  10516.     bra    play_end_fm
  10517. @@:
  10518.     pea    next_cmd_fm(pc)
  10519. do_kill_note_fm:
  10520.     do_kn_fm    0    *FM 強制キーオフ
  10521. do_kn_fm:
  10522.     do_kn_fm    1    *call from ms_key_off_fm
  10523.  
  10524. kill_note_ad:
  10525.     move.b    (a0)+,d1
  10526.     bmi    knm_m_stop_all
  10527.     beq    @f
  10528.     bsr    do_kn_ad
  10529.     cmpi.b    #2,d1
  10530.     bne    next_cmd_ad
  10531.     bra    play_end_ad
  10532. @@:
  10533.     pea    next_cmd_ad(pc)
  10534. do_kill_note_ad:
  10535.     do_kn_ad    0    *ADPCM 強制キーオフ
  10536. do_kn_ad:
  10537.     do_kn_ad    1    *call from ms_key_off_ad
  10538.  
  10539. kill_note_md:
  10540.     move.b    (a0)+,d1
  10541.     bmi    knm_m_stop_all
  10542.     beq    @f
  10543.     bsr    do_kn_md
  10544.     cmpi.b    #2,d1
  10545.     bne    next_cmd_md
  10546.     bra    play_end_md
  10547. @@:
  10548.     pea    next_cmd_md(pc)
  10549. do_kill_note_md:
  10550.     do_kn_md    0    *MIDI 強制キーオフ
  10551. do_kn_md:
  10552.     do_kn_md    1    *call from ms_key_off_md
  10553.  
  10554. knm_m_stop_all:
  10555. reglist    reg    d0/a1-a2/a5
  10556.     movem.l    reglist,-(sp)
  10557.     move.l    play_trk_tbl_se-work(a6),a1
  10558.     move.l    seq_wk_tbl_se-work(a6),a2
  10559.     btst.b    #_ID_SE,p_track_stat(a5)
  10560.     bne    1f
  10561.     move.l    play_trk_tbl-work(a6),a1
  10562.     move.l    seq_wk_tbl-work(a6),a2
  10563. 1:
  10564.     moveq.l    #0,d0
  10565.     move.w    (a1)+,d0
  10566.     bmi    3f
  10567.     swap    d0
  10568.     lsr.l    #16-trwk_size_,d0
  10569.     lea    (a2,d0.l),a5
  10570.     tst.b    p_track_stat(a5)    *死んでるトラックは再演奏不可
  10571.     bmi    1b
  10572.     tst.w    p_type(a5)
  10573.     beq    @f            *FM
  10574.     bmi    2f            *MIDI
  10575.     movem.l    a1-a2,-(sp)
  10576.     bsr    do_kill_note_ad
  10577.     bsr    play_end_ad
  10578.     movem.l    (sp)+,a1-a2
  10579.     bra    1b
  10580. @@:
  10581.     movem.l    a1-a2,-(sp)
  10582.     bsr    do_kill_note_fm
  10583.     bsr    play_end_fm
  10584.     movem.l    (sp)+,a1-a2
  10585.     bra    1b
  10586. 2:
  10587.     movem.l    a1-a2,-(sp)
  10588.     bsr    do_kill_note_md
  10589.     bsr    play_end_md
  10590.     movem.l    (sp)+,a1-a2
  10591.     bra    1b
  10592. 3:
  10593.     movem.l    (sp)+,reglist
  10594.     rts
  10595. *------------------------------------------------------------------------------
  10596. auto_portament_ad:        *ADPCM オートポルタメント
  10597.     bsr    get_auto_portament_param
  10598.     bra    next_cmd_ad
  10599.  
  10600. auto_portament_md:        *MIDI オートポルタメント
  10601.     bset.b    #b_tie_mode,p_md_flg(a5)
  10602.     bsr    get_auto_portament_param
  10603.     bra    next_cmd_md
  10604.  
  10605. auto_portament_fm:        *FM オートポルタメント
  10606.     pea    next_cmd_fm(pc)
  10607.  
  10608. get_auto_portament_param:
  10609.     move.b    (a0)+,d0
  10610.     bmi    @f
  10611.     move.b    p_port2_flg(a5),d1    *get prev.sw
  10612.     move.b    d0,p_port2_flg(a5)    *set sw
  10613.     bmi    @f            *no touch case
  10614.     tst.b    d1
  10615.     bne    @f
  10616.     st.b    p_last_note(a5)        *0→1のときp_last_note初期化
  10617. @@:
  10618.     move.b    (a0)+,d1        *get omt
  10619.     beq    exit_gapp
  10620.     bpl    get_atp_tail
  10621.     move.b    (a0)+,p_port2_dly+0(a5)    *get delay
  10622.     move.b    (a0)+,p_port2_dly+1(a5)
  10623. get_atp_tail:
  10624.     add.b    d1,d1
  10625.     bpl    exit_gapp
  10626.     move.b    (a0)+,p_port2_cnt+0(a5)    *get tail
  10627.     move.b    (a0)+,p_port2_cnt+1(a5)
  10628. exit_gapp:
  10629.     rts
  10630. *------------------------------------------------------------------------------
  10631. key_transpose_fm:            *FM キートランスポーズ
  10632.     move.b    (a0)+,p_transpose(a5)
  10633.     bra    next_cmd_fm
  10634.  
  10635. key_transpose_ad:            *ADPCM キートランスポーズ
  10636.     move.b    (a0)+,p_transpose(a5)
  10637.     bra    next_cmd_ad
  10638.  
  10639. key_transpose_md:            *MIDI キートランスポーズ
  10640.     move.b    (a0)+,p_transpose(a5)
  10641.     bra    next_cmd_md
  10642. *------------------------------------------------------------------------------
  10643. voice_reserve_fm:            *FM 発音数予約
  10644.     move.b    (a0)+,p_voice_rsv+1(a5)
  10645.     bset.b    #b_voice_rsv,p_md_flg(a5)
  10646.     bra    next_cmd_fm
  10647.  
  10648. voice_reserve_ad:            *ADPCM 発音数予約
  10649.     move.b    (a0)+,p_voice_rsv+1(a5)
  10650.     bset.b    #b_voice_rsv,p_md_flg(a5)
  10651.     bra    next_cmd_ad
  10652. *------------------------------------------------------------------------------
  10653. rltv_@b_ad:                *ADPCM 相対ベンド
  10654.     bsr    get_@b_@k
  10655.     bsr    border_chk_@k
  10656.     bra    set_dtn_ad
  10657.  
  10658. rltv_@b_fm:                *FM 相対ベンド
  10659.     bsr    get_@b_@k
  10660.     pea    set_dtn_fm(pc)
  10661.  
  10662. border_chk_@k:
  10663.     add.w    p_detune(a5),d0
  10664.     cmp.w    #7680,d0        境界チェック
  10665.     ble    @f
  10666.     move.w    #7680,d0
  10667.     bra    st_r@k
  10668. @@:
  10669.     cmp.w    #-7680,d0
  10670.     bge    st_r@k
  10671.     move.w    #-7680,d0
  10672. st_r@k:
  10673.     move.w    d0,p_detune(a5)
  10674.     rts
  10675.  
  10676. rltv_@b_md:                *MIDI 相対ベンド
  10677.     move.b    (a0)+,d0
  10678.     lsl.w    #8,d0
  10679.     move.b    (a0)+,d0
  10680.     bsr    border_chk_@b
  10681.     bra    set_dtn_md
  10682.  
  10683. rltv_@k_fm:                *FM 相対ベンド
  10684.     move.b    (a0)+,d0
  10685.     lsl.w    #8,d0
  10686.     move.b    (a0)+,d0
  10687.     bsr    border_chk_@k
  10688.     bra    set_dtn_fm
  10689.  
  10690. rltv_@k_ad:                *ADPCM 相対ベンド
  10691.     move.b    (a0)+,d0
  10692.     lsl.w    #8,d0
  10693.     move.b    (a0)+,d0
  10694.     bsr    border_chk_@k
  10695.     bra    set_dtn_ad
  10696.  
  10697. rltv_@k_md:                *MIDI 相対ベンド
  10698.     bsr    get_@k_@b
  10699.     pea    set_dtn_md(pc)
  10700. border_chk_@b:
  10701.     add.w    p_detune(a5),d0
  10702.     cmp.w    #8191,d0        境界チェック
  10703.     ble    @f
  10704.     move.w    #8191,d0
  10705.     bra    st_r@b
  10706. @@:
  10707.     cmp.w    #-8192,d0
  10708.     bge    st_r@b
  10709.     move.w    #-8192,d0
  10710. st_r@b:
  10711.     move.w    d0,p_detune(a5)
  10712.     rts
  10713.  
  10714. detune_@b_fm:                *デチューン(@B RANGE→@K RANGE)
  10715.     bsr    get_@b_@k
  10716.     move.w    d0,p_detune(a5)        *save detune.@k
  10717.     bra    set_dtn_fm
  10718.  
  10719. detune_@b_ad:                *デチューン(@B RANGE→@K RANGE)
  10720.     bsr    get_@b_@k
  10721.     move.w    d0,p_detune(a5)        *save detune.@k
  10722.     bra    set_dtn_ad
  10723.  
  10724. detune_@b_md:                *デチューン(@B RANGE→@B RANGE)
  10725.     move.b    (a0)+,p_detune+0(a5)
  10726.     move.b    (a0)+,p_detune+1(a5)        *get fm start
  10727. set_dtn_md:
  10728.     clr.b    p_bend_sw(a5)
  10729.     clr.l    p_port_pitch(a5)        *3/28
  10730.     tst.w    p_pitch_param(a5)
  10731.     bne    next_cmd_md
  10732.     move.w    #8,p_pitch_param(a5)
  10733.     bra    next_cmd_md
  10734.  
  10735. detune_@k_fm:                *デチューン(@K RANGE→@K RANGE)
  10736.     move.b    (a0)+,p_detune+0(a5)
  10737.     move.b    (a0)+,p_detune+1(a5)        *get fm start
  10738. set_dtn_fm:
  10739.     clr.b    p_bend_sw(a5)
  10740.     tst.w    p_pitch_param(a5)
  10741.     bne    next_cmd_fm
  10742.     move.w    #8,p_pitch_param(a5)
  10743.     bra    next_cmd_fm
  10744.  
  10745. detune_@k_ad:                *デチューン(@K RANGE→@K RANGE)
  10746.     move.b    (a0)+,p_detune+0(a5)
  10747.     move.b    (a0)+,p_detune+1(a5)        *get fm start
  10748. set_dtn_ad:
  10749.     clr.b    p_bend_sw(a5)
  10750.     tst.w    p_pitch_param(a5)
  10751.     bne    next_cmd_ad
  10752.     move.w    #8,p_pitch_param(a5)
  10753.     bra    next_cmd_ad
  10754.  
  10755. detune_@k_md:                *デチューン(@K RANGE→@B RANGE)
  10756.     bsr    get_@k_@b
  10757.     move.w    d0,p_detune(a5)        *save detune.@k
  10758.     bra    set_dtn_md
  10759.  
  10760. bend_off_fm:                *オートベンドオフ(in case omt=0)
  10761.     move.b    d1,p_bend_sw(a5)
  10762.     bra    next_cmd_fm
  10763.  
  10764. bend_off_ad:                *オートベンドオフ(in case omt=0)
  10765.     move.b    d1,p_bend_sw(a5)
  10766.     bra    next_cmd_ad
  10767.  
  10768. bend_off_md:                *オートベンドオフ(in case omt=0)
  10769.     move.b    d1,p_bend_sw(a5)
  10770.     bra    next_cmd_md
  10771.  
  10772. bend_@b_ad:                *オートベンド(@B RANGE→@K RANGE)
  10773.     move.b    (a0)+,d1        *get omt
  10774.     beq    bend_off_ad
  10775.     bpl    @f
  10776.     bsr    get_@b_@k
  10777.     move.w    d0,p_detune(a5)        *save detune.@k
  10778.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10779. @@:
  10780.     bsr    get_dst_dly_@b_@k
  10781.     bra    next_cmd_ad
  10782.  
  10783. get_@b_@k:
  10784.     move.b    (a0)+,d0
  10785.     lsl.w    #8,d0
  10786.     move.b    (a0)+,d0        *get detune.@b
  10787.     muls    #3,d0
  10788.     asr.l    #5,d0
  10789.     rts
  10790.  
  10791. bend_@b_fm:                *オートベンド(@B RANGE→@K RANGE)
  10792.     move.b    (a0)+,d1        *get omt
  10793.     beq    bend_off_fm
  10794.     bpl    @f
  10795.     bsr    get_@b_@k
  10796.     move.w    d0,p_detune(a5)        *save detune.@k
  10797.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10798. @@:
  10799.     pea    next_cmd_fm(pc)
  10800.  
  10801. get_dst_dly_@b_@k:
  10802.     add.b    d1,d1            *omt check
  10803.     bpl    @f
  10804.     move.b    (a0)+,d0
  10805.     lsl.w    #8,d0
  10806.     move.b    (a0)+,d0        *get bend_end.@b
  10807.     muls    #3,d0
  10808.     asr.l    #5,d0
  10809.     move.w    d0,p_bend_dst(a5)    *save bend_end.@k
  10810.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10811. @@:
  10812. get_delay_tail:
  10813.     add.b    d1,d1            *omt check
  10814.     bpl    get_gdd_tail
  10815.     move.b    (a0)+,p_bend_dly+0(a5)    *get dly
  10816.     move.b    (a0)+,p_bend_dly+1(a5)
  10817. get_gdd_tail:
  10818.     add.b    d1,d1            *omt check
  10819.     bpl    exit_gdd
  10820.     move.b    (a0)+,p_bend_cnt+0(a5)    *get tail
  10821.     move.b    (a0)+,p_bend_cnt+1(a5)
  10822. exit_gdd:
  10823.     rts
  10824.  
  10825. get_@k_@b:
  10826.     move.b    (a0)+,d0
  10827.     lsl.w    #8,d0
  10828.     move.b    (a0)+,d0        *get detune.@b
  10829.     ext.l    d0
  10830.     chg64_683    d0
  10831.     rts
  10832.  
  10833. bend_@k_md:                *オートベンド(@K RANGE→@B RANGE)
  10834.     move.b    (a0)+,d1        *get omt
  10835.     beq    bend_off_md
  10836.     bpl    @f
  10837.     bsr    get_@k_@b
  10838.     move.w    d0,p_detune(a5)        *save detune.@k
  10839.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10840. @@:
  10841.     add.b    d1,d1            *omt check
  10842.     bpl    @f
  10843.     move.b    (a0)+,d0
  10844.     lsl.w    #8,d0
  10845.     move.b    (a0)+,d0        *get bend_end.@b
  10846.     ext.l    d0
  10847.     chg64_683    d0
  10848.     move.w    d0,p_bend_dst(a5)    *save bend_end.@k
  10849.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10850. @@:
  10851.     pea    next_cmd_md(pc)
  10852.     bra    get_delay_tail
  10853.  
  10854. bend_@k_fm:                *オートベンド(@K RANGE→@K RANGE)
  10855.     bsr    get_no_conv
  10856.     bra    next_cmd_fm
  10857.  
  10858. bend_@k_ad:                *オートベンド(@K RANGE→@K RANGE)
  10859.     bsr    get_no_conv
  10860.     bra    next_cmd_ad
  10861.  
  10862. bend_@b_md:
  10863.     pea    next_cmd_md(pc)
  10864.  
  10865. get_no_conv:
  10866.     move.b    (a0)+,d1        *get omt
  10867.     beq    bend_off
  10868.     bpl    @f
  10869.     move.b    (a0)+,p_detune+0(a5)
  10870.     move.b    (a0)+,p_detune+1(a5)    *get fm start
  10871.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10872. @@:
  10873.     add.b    d1,d1            *omt check
  10874.     bpl    get_delay_tail
  10875.     move.b    (a0)+,p_bend_dst+0(a5)
  10876.     move.b    (a0)+,p_bend_dst+1(a5)    *get fm end
  10877.     move.b    #1,p_bend_sw(a5)    *bend switch on
  10878.     bra    get_delay_tail
  10879. bend_off:
  10880.     move.b    d1,p_bend_sw(a5)
  10881.     rts
  10882. *------------------------------------------------------------------------------
  10883. skip_zmd_ad:                *ADPCM スキップコマンド
  10884.     pea    next_cmd_ad(pc)
  10885.     bra    @f
  10886.  
  10887. skip_zmd_md:                *MIDI スキップコマンド
  10888.     pea    next_cmd_md(pc)
  10889.     bra    @f
  10890.  
  10891. skip_zmd_fm:                *FM スキップコマンド
  10892.     pea    next_cmd_fm(pc)
  10893. @@:
  10894.     move.b    (a0)+,d1
  10895.     move.b    (a0)+,d0
  10896.     lsl.w    #8,d0
  10897.     move.b    (a0)+,d0
  10898.     swap    d0
  10899.     move.b    (a0)+,d0
  10900.     lsl.w    #8,d0
  10901.     move.b    (a0)+,d0
  10902.     tst.b    d1
  10903.     bne    @f
  10904.     adda.l    d0,a0
  10905.     rts
  10906. @@:
  10907.     move.l    d0,a0
  10908.     rts
  10909. *------------------------------------------------------------------------------
  10910. pmod_sync_fm:            *FM PMOD ホールド設定
  10911.     pea    next_cmd_fm(pc)
  10912. 1:
  10913.     andi.b    #%0000_0111,p_pmod_flg(a5)    *b_pmod_sync,p_pmod_tiesync,p_pmod_rstsync
  10914.     move.b    (a0)+,d0            *b_pmod_wvsq,b_pmod_wvsqrst
  10915.     or.b    d0,p_pmod_flg(a5)
  10916.     move.b    (a0)+,d0
  10917.     lsl.w    #8,d0
  10918.     move.b    (a0)+,d0
  10919.     tst.w    d0
  10920.     beq    @f
  10921.     move.w    d0,p_pmod_syncnt(a5)
  10922.     move.w    d0,p_pmod_syncnt2(a5)
  10923. @@:
  10924.     rts
  10925.  
  10926. pmod_sync_ad:            *ADPCM PMOD ホールド設定
  10927.     pea    next_cmd_ad
  10928.     bra    1b
  10929.  
  10930. pmod_sync_md:            *MIDI PMOD ホールド設定
  10931.     pea    next_cmd_md
  10932.     bra    1b
  10933. *-----------------------------------------------------------------------------
  10934. arcc_sync_fm:            *FM ARCC ホールド設定
  10935.     pea    next_cmd_fm(pc)
  10936.     bra    @f
  10937.  
  10938. arcc_sync_ad:            *ADPCM ARCC ホールド設定
  10939.     pea    next_cmd_ad(pc)
  10940.     bra    @f
  10941.  
  10942. arcc_sync_md:
  10943.     pea    next_cmd_md(pc)
  10944. @@:
  10945.     bsr    get_arcc_a4
  10946.     andi.b    #%0000_0111,p_arcc_flg(a4)    *b_arcc_sync,p_arcc_tiesync,p_arcc_rstsync
  10947.     move.b    (a0)+,d0            *b_arcc_wvsq,b_arcc_wvsqrst
  10948.     or.b    d0,p_arcc_flg(a4)            *b_arcc_sync
  10949.     move.b    (a0)+,d0
  10950.     lsl.w    #8,d0
  10951.     move.b    (a0)+,d0
  10952.     tst.w    d0
  10953.     beq    @f
  10954.     move.w    d0,p_arcc_syncnt(a4)
  10955.     move.w    d0,p_arcc_syncnt2(a4)
  10956. @@:
  10957.     rts
  10958. *------------------------------------------------------------------------------
  10959. vseq_sync_fm:            *FM VSEQ ホールド設定
  10960.     pea    next_cmd_fm(pc)
  10961.     bra    @f
  10962.  
  10963. vseq_sync_ad:            *ADPCM VSEQ ホールド設定
  10964.     pea    next_cmd_ad(pc)
  10965.     bra    @f
  10966.  
  10967. vseq_sync_md:            *MIDI VSEQ ホールド設定
  10968.     pea    next_cmd_md(pc)
  10969. @@:
  10970.     lea    p_vseq_param(a5),a4
  10971.     andi.b    #%0001_1111,p_arcc_flg(a4)
  10972.     move.b    (a0)+,d0
  10973.     or.b    d0,p_arcc_flg(a4)
  10974.     move.b    (a0)+,d0
  10975.     lsl.w    #8,d0
  10976.     move.b    (a0)+,d0
  10977.     tst.w    d0
  10978.     beq    @f
  10979.     move.w    d0,p_arcc_syncnt(a4)
  10980.     move.w    d0,p_arcc_syncnt2(a4)
  10981. @@:
  10982.     rts
  10983. *------------------------------------------------------------------------------
  10984. tie_mode_md:                *MIDIのタイモードの設定
  10985.     tst.b    (a0)+
  10986.     beq    @f
  10987.     bset.b    #b_tie_mode,p_md_flg(a5)
  10988.     bra    next_cmd_md
  10989. @@:
  10990.     bclr.b    #b_tie_mode,p_md_flg(a5)
  10991.     bra    next_cmd_md
  10992. *------------------------------------------------------------------------------
  10993. pmod_sw_ad:                *ADPCM PMODスイッチ
  10994.     pea    next_cmd_ad(pc)
  10995.     bra    do_pmod_sw
  10996.  
  10997. pmod_sw_fm:                *FM PMODスイッチ
  10998.     pea    next_cmd_fm(pc)
  10999.  
  11000. do_pmod_sw:
  11001.     move.b    (a0)+,d0
  11002.     beq    dpmsw0
  11003.     cmpi.b    #previous_on,d0
  11004.     bne    @f
  11005.     tst.b    p_pmod_sw(a5)
  11006.     bne    exit_dpmsw
  11007.     move.b    p_pmod_sw2(a5),d0
  11008.     bne    @f
  11009.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11010. @@:
  11011.     move.b    d0,p_pmod_sw(a5)
  11012.     bra    calc_pmod
  11013. dpmsw0:
  11014.     * < d0.b=0
  11015.     move.b    p_pmod_sw(a5),d1
  11016.     beq    exit_dpmsw
  11017.     move.b    d1,p_pmod_sw2(a5)
  11018.     move.b    d0,p_pmod_sw(a5)        *sw=0
  11019.     clr.w    p_pmod_dpt_now(a5)        *96/9/16
  11020.     bclr.b    #b_pmod_first,p_pmod_flg(a5)    *97/2/5
  11021. exit_dpmsw:
  11022.     rts
  11023.  
  11024. pmod_sw_md:                *MIDI PMODスイッチ
  11025.     move.b    (a0)+,d0
  11026.     beq    pmsm0
  11027.     cmpi.b    #previous_on,d0
  11028.     bne    @f
  11029.     tst.b    p_pmod_sw(a5)
  11030.     bne    next_cmd_md
  11031.     move.b    p_pmod_sw2(a5),d0
  11032.     bne    @f
  11033.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11034. @@:
  11035.     move.b    d0,p_pmod_sw(a5)
  11036. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  11037.     tst.b    p_pmod_mode(a5)
  11038.     bmi    next_cmd_md        *通常モードの場合はパラメータ計算不要*
  11039.     bsr    calc_pmod
  11040.     bra    next_cmd_md
  11041. pmsm0:
  11042.     move.b    p_pmod_sw(a5),d1
  11043.     beq    @f
  11044.     move.b    d1,p_pmod_sw2(a5)
  11045.     move.b    d0,p_pmod_sw(a5)
  11046. @@:
  11047.     bclr.b    #b_pmod_reset,p_md_flg(a5)
  11048.     beq    next_cmd_md
  11049.     move.l    p_midi_trans(a5),a2
  11050.     moveq.l    #$b0,d0
  11051.     or.b    d4,d0
  11052.     jsr    (a2)
  11053.     moveq.l    #$01,d0            *vibrato
  11054.     jsr    (a2)
  11055.     moveq.l    #$00,d0
  11056.     jsr    (a2)
  11057.     bra    next_cmd_md
  11058. *------------------------------------------------------------------------------
  11059. arcc_sw_ad:
  11060.     pea    next_cmd_ad(pc)
  11061.     bra    do_arcc_sw
  11062.  
  11063. arcc_sw_fm:                *FM ARCCスイッチ
  11064.     pea    next_cmd_fm(pc)
  11065. do_arcc_sw:
  11066.     bsr    get_arcc_a4
  11067.     move.b    (a0)+,d0
  11068.     beq    arsf0
  11069.     cmpi.b    #previous_on,d0
  11070.     bne    @f
  11071.     tst.b    p_arcc_sw(a4)
  11072.     bne    exit_arsf
  11073.     move.b    p_arcc_sw2(a4),d0
  11074.     bne    @f
  11075.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11076. @@:
  11077.     move.b    d0,p_arcc_sw(a4)
  11078.     bra    calc_arcc
  11079. arsf0:
  11080.     move.b    p_arcc_sw(a4),d1
  11081.     beq    exit_arsf
  11082.     move.b    d1,p_arcc_sw2(a4)
  11083.     move.b    d0,p_arcc_sw(a4)
  11084. exit_arsf:
  11085.     rts
  11086.  
  11087. arcc_sw_md:                *FM PMODスイッチ
  11088.     bsr    get_arcc_a4
  11089.     move.b    (a0)+,d0
  11090.     beq    arsm0
  11091.     cmpi.b    #previous_on,d0
  11092.     bne    @f
  11093.     tst.b    p_arcc_sw(a4)
  11094.     bne    next_cmd_md
  11095.     move.b    p_arcc_sw2(a4),d0
  11096.     bne    @f
  11097.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11098. @@:
  11099.     move.b    d0,p_arcc_sw(a4)
  11100. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  11101.     tst.b    p_arcc_mode(a4)
  11102.     bmi    next_cmd_md        *通常モードの場合はパラメータ計算不要*
  11103.     bsr    calc_arcc
  11104.     bra    next_cmd_md
  11105. arsm0:
  11106.     move.b    p_arcc_sw(a4),d1
  11107.     beq    next_cmd_md
  11108.     move.b    d1,p_arcc_sw2(a4)
  11109.     move.b    d0,p_arcc_sw(a4)
  11110.     bra    next_cmd_md
  11111. *------------------------------------------------------------------------------
  11112. bend_sw_ad:                *ADPCM BENDスイッチ
  11113.     move.b    (a0)+,p_bend_sw(a5)
  11114.     bra    next_cmd_ad
  11115.  
  11116. bend_sw_fm:                *FM BENDスイッチ
  11117.     move.b    (a0)+,p_bend_sw(a5)
  11118.     bra    next_cmd_fm
  11119.  
  11120. bend_sw_md:                *MIDI BENDスイッチ
  11121.     move.b    (a0)+,p_bend_sw(a5)
  11122.     bra    next_cmd_md
  11123. *------------------------------------------------------------------------------
  11124. aftc_sw_ad:                *ADPCM AFTERTOUCH SEQUENCEスイッチ
  11125.     bsr    do_aftc_sw
  11126.     bra    next_cmd_ad
  11127.  
  11128. aftc_sw_md:                *MIDI AFTERTOUCH SEQUENCEスイッチ
  11129.     bsr    do_aftc_sw
  11130.     bra    next_cmd_md
  11131.  
  11132. aftc_sw_fm:                *FM AFTERTOUCH SEQUENCEスイッチ
  11133.     pea    next_cmd_fm(pc)
  11134.  
  11135. do_aftc_sw:
  11136.     move.b    (a0)+,d0
  11137.     beq    afsw0
  11138.     cmpi.b    #previous_on,d0
  11139.     bne    @f
  11140.     tst.b    p_aftc_sw(a5)
  11141.     bne    exit_afsw
  11142.     move.b    p_aftc_sw2(a5),d0
  11143.     bne    @f
  11144.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11145. @@:
  11146.     move.b    d0,p_aftc_sw(a5)
  11147. exit_afsw:
  11148.     rts
  11149. afsw0:                    *case:switch=0
  11150.     * < d0.b=0
  11151.     move.b    p_aftc_sw(a5),d1
  11152.     beq    @f
  11153.     move.b    d1,p_aftc_sw2(a5)
  11154.     move.b    d0,p_aftc_sw(a5)
  11155.     bclr.b    #b_aftc_first,p_aftc_flg(a5)    *97/2/5
  11156. @@:
  11157.     rts
  11158. *------------------------------------------------------------------------------
  11159. aftc_sync_fm:                    *FM AFTERTOUCH 同期設定
  11160.     pea    next_cmd_fm(pc)
  11161. 1:
  11162.     andi.b    #%0001_1111,p_aftc_flg(a5)    *b_aftc_sync,p_aftc_tiesync,p_aftc_rstsync
  11163.     move.b    (a0)+,d0            *b_aftc_wvsq,b_aftc_wvsqrst
  11164.     or.b    d0,p_aftc_flg(a5)
  11165.     move.b    (a0)+,d0
  11166.     lsl.w    #8,d0
  11167.     move.b    (a0)+,d0
  11168.     tst.w    d0
  11169.     beq    @f
  11170.     move.w    d0,p_aftc_syncnt(a5)
  11171.     move.w    d0,p_aftc_syncnt2(a5)
  11172. @@:
  11173.     rts
  11174.  
  11175. aftc_sync_ad:                    *ADPCM AFTERTOUCH 同期設定
  11176.     pea    next_cmd_ad(pc)
  11177.     bra    1b
  11178.  
  11179. aftc_sync_md:                    *MIDI AFTERTOUCH 同期設定
  11180.     pea    next_cmd_md(pc)
  11181.     bra    1b
  11182. *-----------------------------------------------------------------------------
  11183. vseq_deepen_ad:                *ADPCM VSEQ振幅増減
  11184.     lea    p_vseq_param(a5),a4
  11185.     bsr    get_arcc_deepen
  11186.     bra    next_cmd_ad
  11187.  
  11188. vseq_deepen_md:                *MIDI VSEQ振幅増減
  11189.     lea    p_vseq_param(a5),a4
  11190.     bsr    get_arcc_deepen
  11191.     bra    next_cmd_md
  11192.  
  11193. vseq_deepen_fm:                *FM VSEQ振幅増減
  11194.     lea    p_vseq_param(a5),a4
  11195.     bsr    get_arcc_deepen
  11196.     bra    next_cmd_fm
  11197. *-----------------------------------------------------------------------------
  11198. vseq_sw_fm:                *FM VSEQスイッチ
  11199.     lea    p_vseq_param(a5),a4
  11200.     bsr    do_vseq_sw
  11201.     bra    next_cmd_fm
  11202.  
  11203. vseq_sw_ad:                *ADPCM VSEQスイッチ
  11204.     lea    p_vseq_param(a5),a4
  11205.     bsr    do_vseq_sw
  11206.     bra    next_cmd_ad
  11207.  
  11208. vseq_sw_md:                *MIDI VSEQスイッチ
  11209.     lea    p_vseq_param(a5),a4
  11210.     pea    next_cmd_md(pc)
  11211. do_vseq_sw:                *VSEQ-SWの場合はここがエントリ
  11212.     move.b    (a0)+,d0
  11213.     beq    vssw0
  11214.     cmpi.b    #previous_on,d0
  11215.     bne    @f
  11216.     tst.b    p_arcc_sw(a4)
  11217.     bne    exit_vssw
  11218.     move.b    p_arcc_sw2(a4),d0
  11219.     bne    @f
  11220.     moveq.l    #1,d0            *保存スイッチが0ならば1にしておく
  11221. @@:
  11222.     move.b    d0,p_arcc_sw(a4)
  11223.     bra    calc_arcc
  11224. vssw0:                    *sw=0
  11225.     * < d0.b=0
  11226.     move.b    p_arcc_sw(a4),d1
  11227.     beq    exit_vssw
  11228.     move.b    d1,p_arcc_sw2(a4)
  11229.     move.b    d0,p_arcc_sw(a4)    *0
  11230.     move.b    d0,p_arcc_dpt_now(a4)    *96/9/16
  11231.     bclr.b    #b_arcc_first,p_arcc_flg(a4)    *97/2/5
  11232. exit_vssw:
  11233.     rts
  11234. *------------------------------------------------------------------------------
  11235. aftertouch_ad:                *ADPCM アフタータッチシーケンス
  11236.     bsr    get_aftc
  11237.     bra    next_cmd_ad
  11238.  
  11239. aftertouch_md:                *MIDI アフタータッチシーケンス
  11240.     bsr    get_aftc
  11241.     bra    next_cmd_md
  11242.  
  11243. aftertouch_fm:                *FM アフタータッチシーケンス
  11244.     pea    next_cmd_fm(pc)
  11245.  
  11246. get_aftc:                *アフタータッチシーケンス・パラメータ取りだし
  11247.     * < d1.w=p_aftc_sw値
  11248.     move.b    (a0)+,d1        *get sw value(0,1,-1,2)
  11249.     beq    ntchaftc        *no touch when 0
  11250.     cmpi.b    #previous_on,d1
  11251.     bne    @f
  11252.     tst.b    p_aftc_sw(a5)
  11253.     bne    ntchaftc
  11254.     move.b    p_aftc_sw2(a5),d1
  11255.     bne    @f
  11256.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11257. @@:
  11258.     move.b    d1,p_aftc_sw(a5)    *set sw value into sw1,2
  11259.     move.b    d1,p_aftc_sw2(a5)
  11260. ntchaftc:
  11261.     move.b    (a0)+,d0        *get omt
  11262.     move.b    d0,p_aftc_omt(a5)
  11263.     beq    aftc_sw0
  11264.     move.b    (a0)+,p_aftc_rltv(a5)    *get rltvmark
  11265.     lea    p_aftc_tbl(a5),a1
  11266. galp00:
  11267.     lsr.b    #1,d0
  11268.     bcc    @f
  11269.     move.b    (a0)+,(a1)
  11270. @@:
  11271.     addq.w    #1,a1
  11272.     tst.b    d0
  11273.     bne    galp00
  11274.     rts
  11275.  
  11276. aftc_sw0:                    *アフタータッチシーケンス・オフ
  11277.     * < d0.b=0
  11278.     move.b    d0,p_aftc_sw(a5)
  11279.     move.b    p_vol(a5),p_aftc_level(a5)    *音量値でリセット
  11280.     bclr.b    #b_aftc_first,p_aftc_flg(a5)    *97/2/5
  11281.     rts
  11282.  
  11283. aftc_delay8_ad:                *ADPCMアフタータッチ・ディレイ設定(8point)
  11284.     bsr    get_afdl8
  11285.     bra    next_cmd_ad
  11286.  
  11287. aftc_delay8_md:                *MIDIアフタータッチ・ディレイ設定(8point)
  11288.     bsr    get_afdl8
  11289.     bra    next_cmd_md
  11290.  
  11291. aftc_delay8_fm:                *FMアフタータッチ・ディレイ設定(8point)
  11292.     pea    next_cmd_fm(pc)
  11293.  
  11294. get_afdl8:                *AFTCディレイ取りだし
  11295.     * X d0-d1/a1
  11296.     move.b    (a0)+,d0        *omt(case0:パラメータは9つある)
  11297.     lsl.w    #8,d0
  11298.     move.b    (a0)+,d0
  11299.     moveq.l    #0,d1
  11300. af8lp00:
  11301.     lsr.w    d0
  11302.     bcc    @f
  11303.     move.b    (a0)+,p_aftc_1st_dly+0(a5,d1.w)
  11304.     move.b    (a0)+,p_aftc_1st_dly+1(a5,d1.w)
  11305. @@:
  11306.     addq.w    #2,d1
  11307.     tst.w    d0
  11308.     bne    af8lp00
  11309.     rts
  11310. *------------------------------------------------------------------------------
  11311. agogik_sync_ad:            *ADPCM アゴギークホールド設定
  11312.     pea    next_cmd_ad(pc)
  11313.     bra    1f
  11314.  
  11315. agogik_sync_md:            *MIDI アゴーギクホールド設定
  11316.     pea    next_cmd_md(pc)
  11317.     bra    1f
  11318.  
  11319. agogik_sync_fm:            *FM アゴーギクホールド設定
  11320.     pea    next_cmd_fm(pc)
  11321. 1:
  11322.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11323.     andi.b    #%0000_0011,p_agogik_flg(a5)    *b_agogik_sync,p_agogik_tiesync
  11324.                         *p_agogik_rstsync,b_agogik_wvsq
  11325.                         *b_agogik_wvsqrst,b_agogik_msrsync
  11326.     move.b    (a0)+,d0            *b_agogik_wvsq,b_agogik_wvsqrst
  11327.     or.b    d0,p_agogik_flg(a5)
  11328.     move.b    (a0)+,d0
  11329.     lsl.w    #8,d0
  11330.     move.b    (a0)+,d0
  11331.     tst.w    d0
  11332.     beq    1f
  11333.     lea.l    agogik_base(a6),a4
  11334.     btst.b    #_ID_SE,p_track_stat(a5)
  11335.     beq    @f
  11336.     lea.l    agogik_base_se(a6),a4
  11337. @@:
  11338.     move.w    d0,p_pmod_syncnt(a4)
  11339.     move.w    d0,p_pmod_syncnt2(a4)
  11340. 1:
  11341.     rts
  11342. *------------------------------------------------------------------------------
  11343. agogik_delay8_md:            *アゴーギク・ディレイ・設定1/8,8point
  11344.     bsr    get_ag_dl8
  11345.     bra    next_cmd_md
  11346.  
  11347. agogik_delay8_ad:            *アゴーギク・ディレイ・設定1/8,8point
  11348.     bsr    get_ag_dl8
  11349.     bra    next_cmd_ad
  11350.  
  11351. agogik_delay8_fm:            *アゴーギク・ディレイ・設定1/8,8point
  11352.     pea    next_cmd_fm(pc)
  11353.  
  11354. get_ag_dl8:
  11355.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11356.     move.l    a5,a4
  11357.     lea.l    agogik_base(a6),a5
  11358.     btst.b    #_ID_SE,p_track_stat(a4)
  11359.     beq    @f
  11360.     lea.l    agogik_base_se(a6),a5
  11361. @@:
  11362.     bsr    get_dp8
  11363.     move.l    a4,a5
  11364.     rts
  11365. *------------------------------------------------------------------------------
  11366. agogik_wf_md:                *MIDI AGOGIK波形タイプセレクト
  11367.     bsr    get_ag_wf
  11368.     bra    next_cmd_md
  11369.  
  11370. agogik_wf_ad:                *ADPCM AGOGIK波形タイプセレクト
  11371.     bsr    get_ag_wf
  11372.     bra    next_cmd_ad
  11373.  
  11374. agogik_wf_fm:                *FM AGOGIK波形タイプセレクト
  11375.     pea    next_cmd_fm(pc)
  11376.  
  11377. get_ag_wf:
  11378.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11379.     move.l    a5,a4
  11380.     lea.l    agogik_base(a6),a5
  11381.     btst.b    #_ID_SE,p_track_stat(a4)
  11382.     beq    @f
  11383.     lea.l    agogik_base_se(a6),a5
  11384. @@:
  11385.     move.b    (a0)+,p_pmod_wf+0(a5)
  11386.     move.b    (a0)+,p_pmod_wf+1(a5)
  11387.     tst.b    p_pmod_sw(a5)
  11388.     beq    @f
  11389.     bsr    calc_pmod
  11390. @@:
  11391.     move.l    a4,a5
  11392.     rts
  11393. *------------------------------------------------------------------------------
  11394. agogik_deepen_ad:                *ADPCM AGOGIK振幅増減
  11395.     pea    next_cmd_ad(pc)
  11396.     bra    @f
  11397.  
  11398. agogik_deepen_md:                *MIDI AGOGIK振幅増減
  11399.     pea    next_cmd_md(pc)
  11400.     bra    @f
  11401.  
  11402. agogik_deepen_fm:                *FM AGOGIK振幅増減
  11403.     pea    next_cmd_fm(pc)
  11404.  
  11405. @@:
  11406.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11407.     move.l    a5,a4
  11408.     lea.l    agogik_base(a6),a5
  11409.     btst.b    #_ID_SE,p_track_stat(a4)
  11410.     beq    @f
  11411.     lea.l    agogik_base_se(a6),a5
  11412. @@:
  11413.     bsr    get_pmod_deepen
  11414.     move.l    a4,a5
  11415.     rts
  11416. *------------------------------------------------------------------------------
  11417. agogik_sw_md:                *MIDI AGOGIKスイッチ
  11418.     bsr    get_ag_sw
  11419.     bra    next_cmd_md
  11420.  
  11421. agogik_sw_ad:                *ADPCM AGOGIKスイッチ
  11422.     bsr    get_ag_sw
  11423.     bra    next_cmd_ad
  11424.  
  11425. agogik_sw_fm:                *FM AGOGIKスイッチ
  11426.     pea    next_cmd_fm(pc)
  11427.  
  11428. get_ag_sw:
  11429.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11430.     move.l    a5,a4
  11431.     lea.l    agogik_base(a6),a5
  11432.     btst.b    #_ID_SE,p_track_stat(a4)
  11433.     beq    @f
  11434.     lea.l    agogik_base_se(a6),a5
  11435. @@:
  11436.     bsr    do_pmod_sw
  11437.     move.l    a4,a5
  11438.     rts
  11439. *------------------------------------------------------------------------------
  11440. agogik_speed8_md:                *アゴーギク・スピード設定1/8,8point
  11441.     bsr    get_ag_sp8
  11442.     bra    next_cmd_md
  11443.  
  11444. agogik_speed8_ad:                *アゴーギク・スピード設定1/8,8point
  11445.     bsr    get_ag_sp8
  11446.     bra    next_cmd_ad
  11447.  
  11448. agogik_speed8_fm:                *アゴー・ギクスピード設定1/8,8point
  11449.     pea    next_cmd_fm(pc)
  11450.  
  11451. get_ag_sp8:
  11452.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11453.     move.l    a5,a4
  11454.     lea.l    agogik_base(a6),a5
  11455.     btst.b    #_ID_SE,p_track_stat(a4)
  11456.     beq    @f
  11457.     lea.l    agogik_base_se(a6),a5
  11458. @@:
  11459.     bsr    get_sp8
  11460.     tst.b    p_pmod_sw(a5)
  11461.     beq    @f
  11462.     bsr    calc_pmod
  11463. @@:
  11464.     move.l    a4,a5
  11465.     rts
  11466. *------------------------------------------------------------------------------
  11467. agogik8_md:                *8point アゴーギク
  11468.     pea    next_cmd_md(pc)
  11469.     bra    get_optag8
  11470.  
  11471. agogik8_ad:                *8point アゴーギク
  11472.     pea    next_cmd_ad(pc)
  11473.     bra    get_optag8
  11474.  
  11475. agogik8_fm:                *8point アゴーギク
  11476.     pea    next_cmd_fm(pc)
  11477.  
  11478. get_optag8:
  11479.     bset.b    #b_agogik_trmk,p_agogik_flg(a5)
  11480.     move.l    a5,a4
  11481.     lea.l    agogik_base(a6),a5
  11482.     btst.b    #_ID_SE,p_track_stat(a4)
  11483.     beq    @f
  11484.     lea.l    agogik_base_se(a6),a5
  11485. @@:
  11486.     move.b    (a0)+,d1        *get sw(0,1,-1)
  11487.     beq    ntchagk            *no touch when 0
  11488.     cmpi.b    #previous_on,d1
  11489.     bne    @f
  11490.     tst.b    p_pmod_sw(a5)
  11491.     bne    ntchagk
  11492.     move.b    p_pmod_sw2(a5),d1
  11493.     bne    @f
  11494.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11495. @@:
  11496.     move.b    d1,p_pmod_sw(a5)
  11497.     move.b    d1,p_pmod_sw2(a5)
  11498. ntchagk:
  11499.     move.b    (a0)+,d0
  11500.     beq    agogik_sw0
  11501.     move.b    d0,p_pmod_omt(a5)
  11502.     bsr    get_pmod8
  11503.     bsr    calc_pmod
  11504.     move.l    a4,a5
  11505.     rts
  11506.  
  11507. agogik_sw0:
  11508.     moveq.l    #0,d0
  11509.     move.b    d0,p_pmod_sw(a5)        *OFF
  11510.     move.l    d0,p_pmod_pitch(a5)        *make it neutral
  11511.     move.w    d0,p_pmod_dpt_now(a5)        *96/9/16
  11512.     bclr.b    #b_pmod_first,p_pmod_flg(a5)    *97/2/5
  11513.     move.l    a4,a5
  11514.     rts
  11515. *------------------------------------------------------------------------------
  11516. pmod_speed8_fm:                *モジュレーションスピード設定1/8,8point
  11517.     bsr    get_sp8
  11518.     tst.b    p_pmod_sw(a5)
  11519.     beq    next_cmd_fm
  11520.     bsr    calc_pmod
  11521.     bra    next_cmd_fm
  11522.  
  11523. pmod_speed8_ad:                *モジュレーションスピード設定1/8,8point
  11524.     bsr    get_sp8
  11525.     tst.b    p_pmod_sw(a5)
  11526.     beq    next_cmd_ad
  11527.     bsr    calc_pmod
  11528.     bra    next_cmd_ad
  11529.  
  11530. pmod_speed8_md:                *モジュレーションスピード設定1/8,8point
  11531.     bsr    get_sp8
  11532.     tst.b    p_pmod_sw(a5)
  11533.     beq    next_cmd_md
  11534. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  11535.     tst.b    p_pmod_mode(a5)        *normal mode時は不要
  11536.     bmi    next_cmd_md
  11537.     bsr    calc_pmod
  11538.     bra    next_cmd_md
  11539.  
  11540. get_sp8:                *PMODスピード取りだし
  11541.     * X d0-d1
  11542.     move.b    (a0)+,d0    *omt
  11543.     moveq.l    #0,d1
  11544. ps8lp00:
  11545.     lsr.b    d0
  11546.     bcc    @f
  11547.     move.b    (a0)+,p_pmod_spd_tbl+0(a5,d1.w)
  11548.     move.b    (a0)+,p_pmod_spd_tbl+1(a5,d1.w)
  11549. @@:
  11550.     addq.w    #2,d1
  11551.     tst.b    d0
  11552.     bne    ps8lp00
  11553.     rts
  11554. *------------------------------------------------------------------------------
  11555. vseq_wf_fm:                *FM VSEQ波形タイプセレクト
  11556.     pea    next_cmd_fm(pc)
  11557.     bra    @f
  11558.  
  11559. vseq_wf_ad:                *ADPCM VSEQ波形タイプセレクト
  11560.     pea    next_cmd_ad(pc)
  11561.     bra    @f
  11562.  
  11563. vseq_wf_md:                *MIDI VSEQ波形タイプセレクト
  11564.     pea    next_cmd_md(pc)
  11565. @@:
  11566.     lea    p_vseq_param(a5),a4
  11567.     move.b    (a0)+,d0
  11568.     beq    exit_vseqwf
  11569.     lsr.b    #1,d0
  11570.     bcc    @f
  11571.     move.b    (a0)+,p_arcc_wf+0(a4)
  11572.     move.b    (a0)+,p_arcc_wf+1(a4)
  11573. @@:
  11574.     lsr.b    #1,d0
  11575.     bcc    @f
  11576.     move.b    (a0)+,p_arcc_origin(a4)
  11577. @@:
  11578.     lsr.b    #1,d0
  11579.     bcc    1f
  11580.     tst.b    (a0)+
  11581.     beq    @f
  11582.     bset.b    #b_arcc_phase,p_arcc_flg2(a4)
  11583.     bra    1f
  11584. @@:
  11585.     bclr.b    #b_arcc_phase,p_arcc_flg2(a4)
  11586. 1:
  11587.     tst.b    p_arcc_sw(a4)
  11588.     bne    calc_arcc
  11589. exit_vseqwf:
  11590.     rts
  11591. *------------------------------------------------------------------------------
  11592. vseq_speed8_fm:                *FM VSEQスピード設定1/8,8point
  11593.     pea    next_cmd_fm(pc)
  11594.     bra    @f
  11595.  
  11596. vseq_speed8_ad:                *ADPCM VSEQスピード設定1/8,8point
  11597.     pea    next_cmd_ad(pc)
  11598.     bra    @f
  11599.  
  11600. vseq_speed8_md:                *MIDI VSEQスピード設定1/8,8point
  11601.     pea    next_cmd_md(pc)
  11602. @@:
  11603.     lea    p_vseq_param(a5),a4
  11604.     bsr    get_sa8
  11605.     tst.b    p_arcc_sw(a4)
  11606.     bne    calc_arcc
  11607.     rts
  11608. *------------------------------------------------------------------------------
  11609. vseq_delay8_fm:                *FM VSEQディレイ設定1/8,8point
  11610.     lea    p_vseq_param(a5),a4
  11611.     bsr    get_da8
  11612.     bra    next_cmd_fm
  11613.  
  11614. vseq_delay8_ad:                *ADPCM VSEQディレイ設定1/8,8point
  11615.     lea    p_vseq_param(a5),a4
  11616.     bsr    get_da8
  11617.     bra    next_cmd_ad
  11618.  
  11619. vseq_delay8_md:                *MIDI VSEQディレイ設定1/8,8point
  11620.     lea    p_vseq_param(a5),a4
  11621.     bsr    get_da8
  11622.     bra    next_cmd_md
  11623. *------------------------------------------------------------------------------
  11624. vseq8_fm:                *FM 8point VSEQ
  11625.     pea    next_cmd_fm(pc)
  11626.     bra    @f
  11627.  
  11628. vseq8_ad:                *ADPCM 8point VSEQ
  11629.     pea    next_cmd_ad(pc)
  11630.     bra    @f
  11631.  
  11632. vseq8_md:                *MIDI 8point VSEQ
  11633.     pea    next_cmd_md(pc)
  11634. @@:
  11635.     lea    p_vseq_param(a5),a4
  11636.     move.b    (a0)+,d1        *switch value
  11637.     beq    1f            *no touch when 0
  11638.     cmpi.b    #previous_on,d1
  11639.     bne    @f
  11640.     tst.b    p_arcc_sw(a4)
  11641.     bne    1f
  11642.     move.b    p_arcc_sw2(a4),d1
  11643.     bne    @f
  11644.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11645. @@:
  11646.     move.b    d1,p_arcc_sw(a4)
  11647.     move.b    d1,p_arcc_sw2(a4)
  11648. 1:
  11649.     move.b    (a0)+,d0        *omt
  11650.     beq    vseqsw0
  11651.     move.b    d0,p_arcc_omt(a4)
  11652.     bsr    get_vseq8
  11653.     bra    calc_arcc
  11654.  
  11655. vseqsw0:
  11656.     * < d0.b=0
  11657.     move.b    d0,p_arcc_sw(a4)        *OFF
  11658.     move.b    d0,p_arcc_dpt_now(a4)        *96/9/16
  11659.     bset.b    #b_arcc_reset,p_arcc_flg(a4)
  11660.     bclr.b    #b_arcc_first,p_arcc_flg(a4)    *97/2/5
  11661.     rts
  11662. *------------------------------------------------------------------------------
  11663. arcc_speed8_fm:                *ARCCスピード設定1/8,8point
  11664.     bsr    get_arcc_a4
  11665.     bsr    get_sa8
  11666.     tst.b    p_arcc_sw(a4)
  11667.     beq    next_cmd_fm
  11668.     bsr    calc_arcc
  11669.     bra    next_cmd_fm
  11670.  
  11671. arcc_speed8_ad:                *ARCCスピード設定1/8,8point
  11672.     bsr    get_arcc_a4
  11673.     bsr    get_sa8
  11674.     tst.b    p_arcc_sw(a4)
  11675.     beq    next_cmd_ad
  11676.     bsr    calc_arcc
  11677.     bra    next_cmd_ad
  11678.  
  11679. arcc_speed8_md:                *ARCCスピード設定1/8,8point
  11680.     bsr    get_arcc_a4
  11681.     bsr    get_sa8
  11682.     tst.b    p_arcc_sw(a4)
  11683.     beq    next_cmd_md
  11684. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  11685.     tst.b    p_arcc_mode(a4)        *normal mode時は不要
  11686.     bmi    next_cmd_md
  11687.     bsr    calc_arcc
  11688.     bra    next_cmd_md
  11689.  
  11690. get_sa8:                *ARCCスピード取りだし
  11691.     * X d0-d1
  11692.     move.b    (a0)+,d0        *omt
  11693.     moveq.l    #0,d1
  11694. as8lp00:
  11695.     lsr.b    d0
  11696.     bcc    @f
  11697.     move.b    (a0)+,p_arcc_spd_tbl+0(a4,d1.w)
  11698.     move.b    (a0)+,p_arcc_spd_tbl+1(a4,d1.w)
  11699. @@:
  11700.     addq.w    #2,d1
  11701.     tst.b    d0
  11702.     bne    as8lp00
  11703.     rts
  11704. *------------------------------------------------------------------------------
  11705. pmod_delay8_fm:                *モジュレーション・ディレイ・設定1/8,8point
  11706.     bsr    get_dp8
  11707.     bra    next_cmd_fm
  11708.  
  11709. pmod_delay8_ad:                *モジュレーション・ディレイ・設定1/8,8point
  11710.     bsr    get_dp8
  11711.     bra    next_cmd_ad
  11712.  
  11713. pmod_delay8_md:                *モジュレーション・ディレイ・設定1/8,8point
  11714.     bsr    get_dp8
  11715.     bra    next_cmd_md
  11716.  
  11717. get_dp8:                *PMODディレイ取りだし
  11718.     * X d0-d1/a1
  11719.     move.b    (a0)+,d0        *omt(case0:パラメータは9つある)
  11720.     lsl.w    #8,d0
  11721.     move.b    (a0)+,d0
  11722.     moveq.l    #0,d1
  11723. dp8lp00:
  11724.     lsr.w    d0
  11725.     bcc    @f
  11726.     move.b    (a0)+,p_pmod_1st_dly+0(a5,d1.w)
  11727.     move.b    (a0)+,p_pmod_1st_dly+1(a5,d1.w)
  11728. @@:
  11729.     addq.w    #2,d1
  11730.     tst.w    d0
  11731.     bne    dp8lp00
  11732.     rts
  11733. *------------------------------------------------------------------------------
  11734. arcc_delay8_fm:                *ARCCディレイ設定1/8,8point
  11735.     bsr    get_arcc_a4
  11736.     bsr    get_da8
  11737.     bra    next_cmd_fm
  11738.  
  11739. arcc_delay8_ad:                *ARCCディレイ設定1/8,8point
  11740.     bsr    get_arcc_a4
  11741.     bsr    get_da8
  11742.     bra    next_cmd_ad
  11743.  
  11744. arcc_delay8_md:                *ARCCディレイ設定1/8,8point
  11745.     bsr    get_arcc_a4
  11746.     pea    next_cmd_md(pc)
  11747.  
  11748. get_da8:                *ARCCディレイ取りだし
  11749.     * X d0-d1/a1
  11750.     move.b    (a0)+,d0        *omt(case0:パラメータは9つある)
  11751.     lsl.w    #8,d0
  11752.     move.b    (a0)+,d0
  11753.     moveq.l    #0,d1
  11754. da8lp00:
  11755.     lsr.w    d0
  11756.     bcc    @f
  11757.     move.b    (a0)+,p_arcc_1st_dly+0(a4,d1.w)
  11758.     move.b    (a0)+,p_arcc_1st_dly+1(a4,d1.w)
  11759. @@:
  11760.     addq.w    #2,d1
  11761.     tst.w    d0
  11762.     bne    da8lp00
  11763.     rts
  11764. *------------------------------------------------------------------------------
  11765. pmod_wf_fm:                *FM PMOD波形タイプセレクト
  11766.     move.b    (a0)+,p_pmod_wf+0(a5)
  11767.     move.b    (a0)+,p_pmod_wf+1(a5)
  11768.     tst.b    p_pmod_sw(a5)
  11769.     beq    next_cmd_fm
  11770.     bsr    calc_pmod
  11771.     bra    next_cmd_fm
  11772.  
  11773. pmod_wf_ad:                *ADPCM PMOD波形タイプセレクト
  11774.     move.b    (a0)+,p_pmod_wf+0(a5)
  11775.     move.b    (a0)+,p_pmod_wf+1(a5)
  11776.     tst.b    p_pmod_sw(a5)
  11777.     beq    next_cmd_ad
  11778.     bsr    calc_pmod
  11779.     bra    next_cmd_ad
  11780.  
  11781. pmod_wf_md:                *MIDI PMOD波形タイプセレクト
  11782.     move.b    (a0)+,p_pmod_wf+0(a5)
  11783.     move.b    (a0)+,p_pmod_wf+1(a5)
  11784.     tst.b    p_pmod_mode(a5)        *通常モード(minus)ならば
  11785.     bpl    @f
  11786.     move.b    #1,p_pmod_mode(a5)    *強制的に拡張PMODに設定
  11787. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  11788. *!1/30    bra    next_cmd_md
  11789. @@:
  11790.     tst.b    p_pmod_sw(a5)
  11791.     beq    next_cmd_md
  11792.     bsr    calc_pmod
  11793.     bra    next_cmd_md
  11794. *------------------------------------------------------------------------------
  11795. arcc_wf_fm:                *FM AMOD波形タイプセレクト
  11796.     bsr    get_arcc_a4
  11797.     move.b    (a0)+,p_arcc_wf+0(a4)
  11798.     move.b    (a0)+,p_arcc_wf+1(a4)
  11799.     tst.b    p_arcc_sw(a4)
  11800.     beq    next_cmd_fm
  11801.     bsr    calc_arcc
  11802.     bra    next_cmd_fm
  11803.  
  11804. arcc_wf_ad:                *ADPCM AMOD波形タイプセレクト
  11805.     bsr    get_arcc_a4
  11806.     move.b    (a0)+,p_arcc_wf+0(a4)
  11807.     move.b    (a0)+,p_arcc_wf+1(a4)
  11808.     tst.b    p_arcc_sw(a4)
  11809.     beq    next_cmd_ad
  11810.     bsr    calc_arcc
  11811.     bra    next_cmd_ad
  11812.  
  11813. arcc_wf_md:                *MIDI AMOD波形タイプセレクト
  11814.     bsr    get_arcc_a4
  11815.     move.b    (a0)+,p_arcc_wf+0(a4)
  11816.     move.b    (a0)+,p_arcc_wf+1(a4)
  11817.     tst.b    p_arcc_mode(a4)        *通常モード(-1)ならば
  11818.     bpl    @f
  11819.     move.b    #1,p_arcc_mode(a4)    *強制的に拡張ARCCに設定
  11820. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  11821. @@:
  11822.     tst.b    p_arcc_sw(a4)
  11823.     beq    next_cmd_md
  11824.     bsr    calc_arcc
  11825.     bra    next_cmd_md
  11826. *------------------------------------------------------------------------------
  11827. pmod_deepen_ad:                    *ADPCM PMOD振幅増減
  11828.     pea    next_cmd_ad(pc)
  11829.     bra    get_pmod_deepen
  11830.  
  11831. pmod_deepen_md:                    *MIDI PMOD振幅増減
  11832.     pea    next_cmd_md(pc)
  11833.     bra    get_pmod_deepen
  11834.  
  11835. pmod_deepen_fm:                    *FM PMOD振幅増減
  11836.     pea    next_cmd_fm(pc)
  11837.  
  11838. get_pmod_deepen:
  11839.     bclr.b    #b_pmod_dpn,p_pmod_flg(a5)    *まずOFF
  11840.     move.b    (a0)+,d1            *get omt
  11841.     bpl    @f
  11842.     bset.b    #b_pmod_dpn,p_pmod_flg(a5)    *minusならばON
  11843. @@:
  11844.     add.b    d1,d1
  11845.     bpl    1f
  11846.     moveq.l    #0,d0
  11847.     move.b    (a0)+,d0            *get speed
  11848.     bpl    @f
  11849.     add.b    d0,d0
  11850.     lsl.w    #7,d0
  11851.     move.b    (a0)+,d0
  11852. @@:
  11853.     move.w    d0,p_pmod_dpnspd(a5)
  11854. 1:
  11855.     add.b    d1,d1
  11856.     bpl    @f
  11857.     move.b    (a0)+,p_pmod_dpndpt+0(a5)    *get depth
  11858.     move.b    (a0)+,p_pmod_dpndpt+1(a5)
  11859. @@:
  11860.     add.b    d1,d1
  11861.     bpl    1f
  11862.     moveq.l    #0,d0
  11863.     move.b    (a0)+,d0            *get repeat time
  11864.     bpl    @f
  11865.     add.b    d0,d0
  11866.     lsl.w    #7,d0
  11867.     move.b    (a0)+,d0
  11868. @@:
  11869.     move.w    d0,p_pmod_dpnrpt(a5)
  11870. 1:
  11871.     rts
  11872. *------------------------------------------------------------------------------
  11873. pmod_sw0:
  11874.     moveq.l    #0,d0
  11875.     move.b    d0,p_pmod_sw(a5)        *OFF
  11876.     move.l    d0,p_pmod_pitch(a5)        *make it neutral
  11877.     move.w    d0,p_pmod_dpt_now(a5)        *96/9/16
  11878.     bclr.b    #b_pmod_first,p_pmod_flg(a5)    *97/2/5
  11879.     rts
  11880.  
  11881. pmod_sw0_md:
  11882.     moveq.l    #0,d0
  11883.     move.b    d0,p_pmod_sw(a5)        *OFF
  11884.     move.l    d0,p_pmod_pitch(a5)        *make it neutral
  11885.     move.w    d0,p_pmod_dpt_now(a5)        *96/9/16
  11886.     bclr.b    #b_pmod_first,p_pmod_flg(a5)    *97/2/5
  11887.     bclr.b    #b_pmod_reset,p_md_flg(a5)
  11888.     beq    @f
  11889.     move.l    p_midi_trans(a5),a2
  11890.     moveq.l    #$b0,d0
  11891.     or.b    d4,d0
  11892.     jsr    (a2)
  11893.     moveq.l    #$01,d0            *vibrato
  11894.     jsr    (a2)
  11895.     moveq.l    #$00,d0
  11896.     jmp    (a2)
  11897. @@:
  11898.     rts
  11899.  
  11900. get_pmod8:                *PMODの振幅取りだし
  11901.     lea    p_pmod_dpt_tbl(a5),a1
  11902. m8flp0:
  11903.     lsr.b    #1,d0
  11904.     bcc    m8omtd
  11905.     move.b    (a0)+,(a1)+
  11906.     move.b    (a0)+,(a1)+
  11907.     tst.b    d0
  11908.     bne    m8flp0
  11909.     rts
  11910. m8omtd:
  11911.     addq.w    #2,a1
  11912.     tst.b    d0
  11913.     bne    m8flp0
  11914.     rts
  11915.  
  11916. pmod8_md:                *1/8 ピッチモジュレーション
  11917.     pea    next_cmd_md(pc)
  11918.     move.b    (a0)+,d1        *get sw(0,1,-1,2)
  11919.     beq    ntchp8md        *no touch when 0
  11920.     cmpi.b    #previous_on,d1
  11921.     bne    @f
  11922.     tst.b    p_pmod_sw(a5)
  11923.     bne    ntchp8md
  11924.     move.b    p_pmod_sw2(a5),d1
  11925.     bne    @f
  11926.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11927. @@:
  11928.     move.b    d1,p_pmod_sw(a5)
  11929.     move.b    d1,p_pmod_sw2(a5)
  11930. ntchp8md:
  11931.     move.b    (a0)+,d0
  11932.     beq    pmod_sw0_md
  11933.     move.b    d0,p_pmod_omt(a5)
  11934.     bsr    get_pmod8
  11935. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  11936.     tst.b    p_pmod_mode(a5)
  11937.     bpl    calc_pmod
  11938.                     *    tie中に設定変更されたことも想定して
  11939.                     ***!2/5    念のためにパラメータを設定する
  11940.     moveq.l    #0,d0
  11941.     move.b    p_pmod_n(a5),d0
  11942.     cmpi.b    #7,d0
  11943.     bhi    2f
  11944.     btst.b    d0,p_pmod_omt(a5)    *省略の場合は前回のものを継続
  11945.     beq    2f
  11946.     add.w    d0,d0
  11947.     move.w    p_pmod_dpt_tbl(a5,d0.w),d0    *次の振幅パラメータ
  11948.     beq    1f
  11949.     bpl    @f
  11950.     neg.w    d0
  11951. @@:                    *振幅値縮小処理
  11952.     cmpi.w    #127,d0            *(振幅パラメータを尊重するため出力時に行う)
  11953.     bls    1f
  11954.     moveq.l    #127,d0
  11955. 1:
  11956.     move.w    d0,p_pmod_dpt_now(a5)
  11957.     move.w    d0,p_pmod_pitch(a5)    *わざと.w
  11958.     or.w    #$8000,p_level_param(a5)
  11959. 2:
  11960.     rts                ***!2/5
  11961.  
  11962. pmod8_ad:                *1/8 ピッチモジュレーション
  11963.     pea    next_cmd_ad(pc)
  11964.     move.b    (a0)+,d1        *get sw(0,1,-1,2)
  11965.     beq    ntchp8ad        *no touch when 0
  11966.     cmpi.b    #previous_on,d1
  11967.     bne    @f
  11968.     tst.b    p_pmod_sw(a5)
  11969.     bne    ntchp8ad
  11970.     move.b    p_pmod_sw2(a5),d1
  11971.     bne    @f
  11972.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11973. @@:
  11974.     move.b    d1,p_pmod_sw(a5)
  11975.     move.b    d1,p_pmod_sw2(a5)
  11976. ntchp8ad:
  11977.     move.b    (a0)+,d0
  11978.     beq    pmod_sw0
  11979.     move.b    d0,p_pmod_omt(a5)
  11980.     bsr    get_pmod8
  11981.     bra    calc_pmod
  11982.  
  11983. pmod8_fm:                *1/8 ピッチモジュレーション
  11984.     pea    next_cmd_fm(pc)
  11985.     move.b    (a0)+,d1        *get sw(0,1,-1)
  11986.     beq    ntchp8fm        *no touch when 0
  11987.     cmpi.b    #previous_on,d1
  11988.     bne    @f
  11989.     tst.b    p_pmod_sw(a5)
  11990.     bne    ntchp8fm
  11991.     move.b    p_pmod_sw2(a5),d1
  11992.     bne    @f
  11993.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  11994. @@:
  11995.     move.b    d1,p_pmod_sw(a5)
  11996.     move.b    d1,p_pmod_sw2(a5)
  11997. ntchp8fm:
  11998.     move.b    (a0)+,d0
  11999.     beq    pmod_sw0
  12000.     move.b    d0,p_pmod_omt(a5)
  12001.     bsr    get_pmod8
  12002.  
  12003. calc_pmod:                *PMODのパラメータ計算
  12004.     move.l    d4,-(sp)
  12005. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  12006.     move.b    p_pmod_omt(a5),d3
  12007.     moveq.l    #0,d5            *2++
  12008.     move.w    p_pmod_wf(a5),d0
  12009.     bmi    @f            *波形メモリケース
  12010.     move.b    cpmdjt(pc,d0.w),d0
  12011.     jmp    cpmdjt(pc,d0.w)
  12012. cpmdjt:
  12013.     dc.b    do_cpmd-cpmdjt        *wf0:saw
  12014.     dc.b    stp_eq_dpt-cpmdjt    *wf1:squ
  12015.     dc.b    cpmd_wf2-cpmdjt        *wf2:tri
  12016.     dc.b    do_cpmd-cpmdjt        *wf3:saw2
  12017.     dc.b    stp_eq_dpt-cpmdjt    *wf4:nos
  12018.     .even
  12019. @@:                    *波形メモリケース
  12020.     andi.l    #$7fff,d0
  12021.     move.l    d0,d1
  12022.     lsl.l    #wv_tbl_size_,d0
  12023.     move.l    wave_tbl-work(a6),a1
  12024.     adda.l    d0,a1
  12025.     lea    p_wvpm_start(a5),a2
  12026.     cmp.w    wave_n_max-work(a6),d1
  12027.     bcs    @f
  12028.     bsr    set_dummy_wave        *dummy波形をセット
  12029.     bra    stp_eq_dpt
  12030. @@:
  12031.     move.l    (a1)+,d0
  12032.     move.l    d0,(a2)+        *start
  12033.     addq.w    #4,a2
  12034. *    move.l    d0,(a2)+        *point
  12035.     move.l    (a1)+,(a2)+        *end
  12036.     move.w    (a1)+,(a2)+        *loop mode
  12037.     move.l    (a1)+,(a2)+        *loop start
  12038.     move.l    (a1)+,(a2)+        *loop end
  12039.     move.l    (a1)+,d0
  12040.     move.l    d0,(a2)+        *loop time
  12041.     move.l    d0,(a2)+        *loop time2
  12042. stp_eq_dpt:                *加算ワーク=振幅値のケース(sq,noise,wvmm)
  12043. sedlp0:
  12044.     lsr.b    #1,d3
  12045.     bcc    @f
  12046.     move.w    d5,d0
  12047.     add.w    d0,d0
  12048.     move.w    p_pmod_dpt_tbl(a5,d5.w),p_pmod_stp_tbl(a5,d0.w)
  12049. @@:
  12050.     addq.w    #2,d5
  12051.     tst.b    d3
  12052.     bne    sedlp0
  12053.     bra    cpmd_00
  12054.  
  12055. cpmd_wf2:                *case:三角波
  12056.     moveq.l    #1,d7            *d7=シフトパラメータ (÷2)
  12057.     bra    @f
  12058. do_cpmd:                *case:ノコギリ波
  12059.     moveq.l    #0,d7            *d7=シフトパラメータ (÷1)
  12060. @@:
  12061.     moveq.l    #0,d6            *4++
  12062. cpmd_lp0:
  12063.     lsr.b    #1,d3
  12064.     bcc    next_cpmd
  12065.     move.w    p_pmod_spd_tbl(a5,d5.w),d1
  12066.     bne    @f
  12067.     move.l    d4,d1
  12068. @@:
  12069.     move.l    d1,d4
  12070.     tst.l    d7            *!nokoのときの特別演算
  12071.     bne    @f            *!
  12072.     subq.w    #1,d1            *!
  12073. @@:
  12074.     lsr.w    d7,d1
  12075.     bne    @f
  12076.     moveq.l    #1,d1
  12077. @@:
  12078.     moveq.l    #0,d2
  12079.     move.w    p_pmod_dpt_tbl(a5,d5.w),d2
  12080.     bmi    @f
  12081.     divu    d1,d2        *d2=range/L d2.w=step counter
  12082.     move.w    d2,d0
  12083.     clr.w    d2
  12084.     divu    d1,d2        *d2=d2/L
  12085.     swap    d0
  12086.     move.w    d2,d0
  12087.     addq.l    #1,d0
  12088.     move.l    d0,p_pmod_stp_tbl(a5,d6.w)
  12089.     bra    next_cpmd
  12090. @@:
  12091.     neg.w    d2
  12092.     divu    d1,d2        *d2=range/L d2.w=step counter
  12093.     move.w    d2,d0
  12094.     clr.w    d2
  12095.     divu    d1,d2        *d2=d2/L
  12096.     swap    d0
  12097.     move.w    d2,d0
  12098.     neg.l    d0
  12099.     move.l    d0,p_pmod_stp_tbl(a5,d6.w)
  12100. next_cpmd:
  12101.     addq.w    #2,d5
  12102.     addq.w    #4,d6
  12103.     tst.b    d3
  12104.     bne    cpmd_lp0
  12105.                     *tie中に設定変更されたことも想定して
  12106. cpmd_00:                *念のためにパラメータを設定する
  12107.     move.b    #1,p_pmod_chain(a5)    *接続待ちへ
  12108.     moveq.l    #0,d0
  12109.     move.b    p_pmod_n(a5),d0
  12110.     cmpi.b    #7,d0
  12111.     bhi    exit_cpmd
  12112.     btst.b    d0,p_pmod_omt(a5)    *省略の場合は前回のものを継続
  12113.     beq    exit_cpmd
  12114.     add.w    d0,d0
  12115.     move.w    p_pmod_dpt_tbl(a5,d0.w),p_pmod_dpt_now(a5)
  12116.     move.w    p_pmod_spd_tbl(a5,d0.w),d1
  12117.     beq    @f
  12118.     move.w    d1,p_pmod_spd_next(a5)    *次の波形生成パラメータ
  12119. @@:
  12120.     add.w    d0,d0
  12121.     move.l    p_pmod_stp_tbl(a5,d0.w),p_pmod_step_next(a5)    *次の波形生成パラメータ
  12122. exit_cpmd:
  12123.     move.l    (sp)+,d4        *破壊したので復元
  12124.     rts
  12125. *------------------------------------------------------------------------------
  12126. asgn_arcc_fm:            *ARCC セット
  12127.     bsr    get_arcc_a4
  12128.     bsr    get_@c
  12129.     bra    next_cmd_fm
  12130.  
  12131. asgn_arcc_ad:            *ARCC セット
  12132.     bsr    get_arcc_a4
  12133.     bsr    get_@c
  12134.     bra    next_cmd_ad
  12135.  
  12136. asgn_arcc_md:            *ARCC セット
  12137.     bsr    get_arcc_a4
  12138.     pea    next_cmd_md(pc)
  12139.  
  12140. get_@c:
  12141.     move.b    (a0)+,d1        *get omt
  12142.     beq    exit_get_@c
  12143.     add.b    d1,d1
  12144.     bcc    @f
  12145.     move.b    (a0)+,p_arcc(a4)    *ctrl
  12146. @@:
  12147.     add.b    d1,d1
  12148.     bcc    @f
  12149.     move.b    (a0)+,p_arcc_reset(a4)    *reset value
  12150. @@:
  12151.     add.b    d1,d1
  12152.     bcc    @f
  12153.     move.b    (a0)+,p_arcc_origin(a4)    *starting point
  12154. @@:
  12155.     add.b    d1,d1
  12156.     bcc    1f
  12157.     tst.b    (a0)+
  12158.     beq    @f
  12159.     bset.b    #b_arcc_phase,p_arcc_flg2(a4)
  12160.     bra    1f
  12161. @@:
  12162.     bclr.b    #b_arcc_phase,p_arcc_flg2(a4)
  12163. 1:
  12164. exit_get_@c:
  12165.     st.b    p_arcc_last(a4)        *初期化
  12166.     rts
  12167. *------------------------------------------------------------------------------
  12168. arcc_deepen_ad:                    *ADPCM ARCC振幅増減
  12169.     bsr    get_arcc_a4
  12170.     pea    next_cmd_ad(pc)
  12171.     bra    get_arcc_deepen
  12172.  
  12173. arcc_deepen_md:                    *MIDI ARCC振幅増減
  12174.     bsr    get_arcc_a4
  12175.     pea    next_cmd_md(pc)
  12176.     bra    get_arcc_deepen
  12177.  
  12178. arcc_deepen_fm:                    *FM ARCC振幅増減
  12179.     bsr    get_arcc_a4
  12180.     pea    next_cmd_fm(pc)
  12181.  
  12182. get_arcc_deepen:
  12183.     bclr.b    #b_arcc_dpn,p_arcc_flg(a4)    *まずOFF
  12184.     move.b    (a0)+,d1            *get omt
  12185.     bpl    @f
  12186.     bset.b    #b_arcc_dpn,p_arcc_flg(a4)    *minusならばON
  12187. @@:
  12188.     add.b    d1,d1
  12189.     bpl    1f
  12190.     moveq.l    #0,d0
  12191.     move.b    (a0)+,d0            *get speed
  12192.     bpl    @f
  12193.     add.b    d0,d0
  12194.     lsl.w    #7,d0
  12195.     move.b    (a0)+,d0
  12196. @@:
  12197.     move.w    d0,p_arcc_dpnspd(a4)
  12198. 1:
  12199.     add.b    d1,d1
  12200.     bpl    @f
  12201.     move.b    (a0)+,p_arcc_dpndpt(a4)        *get depth
  12202. @@:
  12203.     add.b    d1,d1
  12204.     bpl    1f
  12205.     moveq.l    #0,d0
  12206.     move.b    (a0)+,d0            *get repeat time
  12207.     bpl    @f
  12208.     add.b    d0,d0
  12209.     lsl.w    #7,d0
  12210.     move.b    (a0)+,d0
  12211. @@:
  12212.     move.w    d0,p_arcc_dpnrpt(a4)
  12213. 1:
  12214.     rts
  12215. *------------------------------------------------------------------------------
  12216. get_arcc_a4:                *ARCCパラメータのベースアドレスを得る
  12217.     * > a4.l=ARCC parameter base address
  12218.     * > d0.w=ARCC number*2
  12219.     * x d0
  12220.     moveq.l    #0,d0
  12221.     move.b    (a0)+,d0        *ARCC number(0~3)*2
  12222.     lea    p_arcc_param(a5),a4
  12223.     add.w    saf0tbl(pc,d0.w),a4
  12224.     rts
  12225. saf0tbl:
  12226.     dc.w    __arcc_len*0
  12227.     dc.w    __arcc_len*1
  12228.     dc.w    __arcc_len*2
  12229.     dc.w    __arcc_len*3
  12230.  
  12231. get_arcc8:                *ARCCの振幅取りだし
  12232. get_vseq8:                *VSEQ8のエントリ
  12233.     lea    p_arcc_dpt_tbl(a4),a1
  12234. a8flp0:
  12235.     lsr.b    #1,d0
  12236.     bcc    @f
  12237.     move.b    (a0)+,(a1)
  12238. @@:
  12239.     addq.w    #1,a1
  12240.     tst.b    d0
  12241.     bne    a8flp0
  12242.     rts
  12243.  
  12244. arcc_sw0_md:
  12245.     * < d0.b=0
  12246.     move.b    d0,p_arcc_sw(a4)            *OFF
  12247.     move.b    d0,p_arcc_dpt_now(a4)            *96/9/16
  12248.     bset.b    #b_arcc_reset,p_arcc_flg(a4)
  12249.     bclr.b    #b_arcc_first,p_arcc_flg(a4)        *97/2/5
  12250.     or.w    d6,p_level_param(a5)            *mark
  12251.     cmpi.b    #MIDI_VOL,p_arcc(a4)            *競合チェック
  12252.     bne    @f
  12253.     bclr.b    #pts_volume,p_timbre_set(a5)
  12254.     rts
  12255. @@:
  12256.     cmpi.b    #MIDI_PAN,p_arcc(a4)            *競合チェック
  12257.     bne    @f
  12258.     bclr.b    #pts_panpot,p_timbre_set(a5)
  12259.     rts
  12260. @@:
  12261.     cmpi.b    #MIDI_DMP,p_arcc(a4)            *競合チェック
  12262.     bne    @f
  12263.     bclr.b    #pts_damper,p_timbre_set(a5)
  12264. @@:
  12265.     rts
  12266.  
  12267. arcc_sw0:
  12268.     * < d0.b=0
  12269.     move.b    d0,p_arcc_sw(a4)            *OFF
  12270.     move.b    d0,p_arcc_dpt_now(a4)            *96/9/16
  12271.     clr.w    p_arcc_level(a4)            *96/10/26
  12272.     bset.b    #b_arcc_reset,p_arcc_flg(a4)
  12273.     bclr.b    #b_arcc_first,p_arcc_flg(a4)        *97/2/5
  12274.     or.w    d6,p_level_param(a5)            *mark
  12275.     rts
  12276.  
  12277. arcc8_md:                *1/8 ARCC
  12278.     bsr    get_arcc_a4
  12279.     move.w    arcc8_marker(pc,d0.w),d6
  12280.     pea    next_cmd_md(pc)
  12281.     move.b    (a0)+,d1        *switch value
  12282.     beq    ntcha8md        *no touch when 0
  12283.     cmpi.b    #previous_on,d1
  12284.     bne    @f
  12285.     tst.b    p_arcc_sw(a4)
  12286.     bne    ntcha8md
  12287.     move.b    p_arcc_sw2(a4),d1
  12288.     bne    @f
  12289.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  12290. @@:
  12291.     move.b    d1,p_arcc_sw(a4)
  12292.     move.b    d1,p_arcc_sw2(a4)
  12293. ntcha8md:
  12294.     move.b    (a0)+,d0        *omt
  12295.     beq    arcc_sw0_md
  12296.     move.b    d0,p_arcc_omt(a4)
  12297.     bsr    get_arcc8
  12298. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  12299.     tst.b    p_arcc_mode(a4)
  12300.     bpl    calc_arcc
  12301.                     *    tie中に設定変更されたことも想定して
  12302.                     ***!2/5    念のためにパラメータを設定する
  12303.     moveq.l    #0,d0
  12304.     move.b    p_arcc_n(a4),d0
  12305.     cmpi.b    #7,d0
  12306.     bhi    2f
  12307.     btst.b    d0,p_arcc_omt(a4)    *省略の場合は前回のものを継続
  12308.     beq    2f
  12309.     move.b    p_arcc_dpt_tbl(a4,d0.w),d1
  12310.     ext.w    d1
  12311.     bpl    1f
  12312.     neg.w    d1
  12313.     cmpi.w    #127,d1
  12314.     bls    1f
  12315.     moveq.l    #127,d1
  12316. 1:
  12317.     move.b    d1,p_arcc_dpt_now(a4)
  12318.     move.b    d1,p_arcc_level(a4)    *次の振幅パラメータ
  12319.     or.w    d6,p_level_param(a5)    *mark
  12320. 2:                    ***!2/5
  12321.     rts
  12322.  
  12323. arcc8_marker:
  12324.     dc.w    $80,$40,$20,$10
  12325.  
  12326. arcc8_ad:                *1/8 ARCC
  12327.     bsr    get_arcc_a4
  12328.     move.w    arcc8_marker(pc,d0.w),d6
  12329.     pea    next_cmd_ad(pc)
  12330.     move.b    (a0)+,d1        *switch value
  12331.     beq    ntcja8ad        *no touch when 0
  12332.     cmpi.b    #previous_on,d1
  12333.     bne    @f
  12334.     tst.b    p_arcc_sw(a4)
  12335.     bne    ntcja8ad
  12336.     move.b    p_arcc_sw2(a4),d1
  12337.     bne    @f
  12338.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  12339. @@:
  12340.     move.b    d1,p_arcc_sw(a4)
  12341.     move.b    d1,p_arcc_sw2(a4)
  12342. ntcja8ad:
  12343.     move.b    (a0)+,d0        *omt
  12344.     beq    arcc_sw0
  12345.     move.b    d0,p_arcc_omt(a4)
  12346.     bsr    get_arcc8
  12347.     bra    calc_arcc
  12348.  
  12349. arcc8_fm:                *1/8 ARCC
  12350.     bsr    get_arcc_a4
  12351.     move.w    arcc8_marker(pc,d0.w),d6
  12352.     pea    next_cmd_fm(pc)
  12353.     move.b    (a0)+,d1        *switch value
  12354.     beq    ntcha8fm        *no touch when 0
  12355.     cmpi.b    #previous_on,d1
  12356.     bne    @f
  12357.     tst.b    p_arcc_sw(a4)
  12358.     bne    ntcha8fm
  12359.     move.b    p_arcc_sw2(a4),d1
  12360.     bne    @f
  12361.     moveq.l    #1,d1            *保存スイッチが0ならば1にしておく
  12362. @@:
  12363.     move.b    d1,p_arcc_sw(a4)
  12364.     move.b    d1,p_arcc_sw2(a4)
  12365. ntcha8fm:
  12366.     move.b    (a0)+,d0        *omt
  12367.     beq    arcc_sw0
  12368.     move.b    d0,p_arcc_omt(a4)
  12369.     bsr    get_arcc8
  12370.  
  12371. calc_arcc:                *ARCCのパラメータ計算
  12372.     * - d4
  12373.     move.l    d4,-(sp)        *tie中に設定変更されたことも想定して
  12374. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  12375.     move.b    p_arcc_omt(a4),d3
  12376.     moveq.l    #0,d5            *2++
  12377.     move.w    p_arcc_wf(a4),d0
  12378.     bmi    @f            *波形メモリケース
  12379.     move.b    camdjt(pc,d0.w),d0
  12380.     jmp    camdjt(pc,d0.w)
  12381. camdjt:
  12382.     dc.b    camd_saw-camdjt        *wf0:saw
  12383.     dc.b    stp_eq_dpt2-camdjt    *wf1:squ
  12384.     dc.b    do_camd-camdjt        *wf2:tri
  12385.     dc.b    camd_saw-camdjt        *wf3:saw2
  12386.     dc.b    stp_eq_dpt2-camdjt    *wf4:nos
  12387.     .even
  12388. @@:                    *波形メモリケース
  12389.     andi.l    #$7fff,d0
  12390.     move.l    d0,d1
  12391.     lsl.l    #wv_tbl_size_,d0
  12392.     move.l    wave_tbl-work(a6),a1
  12393.     adda.l    d0,a1
  12394.     lea    p_wvam_start(a4),a2
  12395.     cmp.w    wave_n_max-work(a6),d1
  12396.     bcs    @f
  12397.     bsr    set_dummy_wave        *dummy波形をセット
  12398.     bra    stp_eq_dpt2
  12399. @@:
  12400.     move.l    (a1)+,d0
  12401.     move.l    d0,(a2)+        *start
  12402.     addq.w    #4,a2
  12403. *    move.l    d0,(a2)+        *point
  12404.     move.l    (a1)+,(a2)+        *end
  12405.     move.w    (a1)+,(a2)+        *loop mode
  12406.     move.l    (a1)+,(a2)+        *loop start
  12407.     move.l    (a1)+,(a2)+        *loop end
  12408.     move.l    (a1)+,d0
  12409.     move.l    d0,(a2)+        *loop time
  12410.     move.l    d0,(a2)+        *loop time2
  12411. stp_eq_dpt2:                *加算ワーク=振幅値のケース(sq,noise,wvmm)
  12412. sed2lp0:
  12413.     lsr.b    #1,d3
  12414.     bcc    @f
  12415.     move.w    d5,d0
  12416.     add.w    d0,d0
  12417.     move.b    p_arcc_dpt_tbl(a4,d5.w),p_arcc_stp_tbl(a4,d0.w)
  12418. @@:
  12419.     addq.w    #1,d5
  12420.     tst.b    d3
  12421.     bne    sed2lp0
  12422.     bra    camd_00
  12423.  
  12424. camd_saw:                *case:ノコギリ波
  12425.     moveq.l    #1,d7            *d7=シフトパラメータ (×2)
  12426.     bra    @f
  12427. do_camd:                *case:三角波
  12428.     moveq.l    #0,d7            *d7=シフトパラメータ (×1)
  12429. @@:
  12430.     moveq.l    #0,d6            *1++
  12431. camd_lp0:
  12432.     lsr.b    #1,d3
  12433.     bcc    next_camd
  12434.     move.w    p_arcc_spd_tbl(a4,d5.w),d1
  12435.     bne    @f
  12436.     move.l    d4,d1
  12437. @@:
  12438.     move.l    d1,d4
  12439.     lsl.w    d7,d1
  12440.     tst.l    d7            *!nokoのときの特別演算
  12441.     beq    @f            *!
  12442.     subq.w    #1,d1            *!
  12443. @@:
  12444.     moveq.l    #0,d2
  12445.     move.b    p_arcc_dpt_tbl(a4,d6.w),d2
  12446.     bmi    @f
  12447.     divu    d1,d2        *d2=range/L d2.w=step counter
  12448.     move.w    d2,d0
  12449.     clr.w    d2
  12450.     divu    d1,d2        *d2=d2/L
  12451.     swap    d0
  12452.     move.w    d2,d0
  12453.     addq.l    #1,d0
  12454.     asr.l    #8,d0
  12455.     move.w    d0,p_arcc_stp_tbl(a4,d5.w)
  12456.     bra    next_camd
  12457. @@:
  12458.     neg.b    d2
  12459.     divu    d1,d2        *d2=range/L d2.w=step counter
  12460.     move.w    d2,d0
  12461.     clr.w    d2
  12462.     divu    d1,d2        *d2=d2/L
  12463.     swap    d0
  12464.     move.w    d2,d0
  12465.     neg.l    d0
  12466.     asr.l    #8,d0
  12467.     move.w    d0,p_arcc_stp_tbl(a4,d5.w)
  12468. next_camd:
  12469.     addq.w    #1,d6
  12470.     addq.w    #2,d5
  12471.     tst.b    d3
  12472.     bne    camd_lp0
  12473. camd_00:                *念のためにパラメータを設定する
  12474.     move.b    #1,p_arcc_chain(a4)    *接続待ちへ
  12475.     moveq.l    #0,d0
  12476.     move.b    p_arcc_n(a4),d0
  12477.     cmpi.b    #7,d0
  12478.     bhi    exit_camd
  12479.     btst.b    d0,p_arcc_omt(a4)    *省略の場合は前回のものを継続
  12480.     beq    exit_camd
  12481.     move.b    p_arcc_dpt_tbl(a4,d0.w),d1
  12482.     move.b    d1,p_arcc_dpt_now(a4)
  12483.     bmi    @f
  12484.     moveq.l    #0,d1
  12485. @@:
  12486.     lsl.w    #8,d1                *256倍する
  12487.     move.w    d1,p_arcc_o_next(a4)                *次の波形生成パラメータ
  12488.     add.w    d0,d0
  12489.     move.w    p_arcc_spd_tbl(a4,d0.w),d1
  12490.     beq    @f
  12491.     move.w    d1,p_arcc_spd_next(a4)    *次の波形生成パラメータ
  12492. @@:
  12493.     move.w    p_arcc_stp_tbl(a4,d0.w),p_arcc_step_next(a4)    *次の波形生成パラメータ
  12494. exit_camd:
  12495.     move.l    (sp)+,d4        *破壊したので復元
  12496.     rts
  12497.  
  12498. set_dummy_wave:
  12499.     * < a2.l=to be initialized
  12500.     * x a1
  12501.     lea    wv_dmy,a1
  12502.     move.l    a1,(a2)+    *start address
  12503.     move.l    a1,(a2)+    *point address
  12504.     addq.w    #2,a1
  12505.     move.l    a1,(a2)+    *end address
  12506.     subq.w    #2,a1
  12507.     move.w    #$00ff,(a2)+    *loop mode=∞
  12508.     move.l    a1,(a2)+    *loop start point
  12509.     addq.w    #2,a1
  12510.     move.l    a1,(a2)+    *loop end point
  12511.     clr.l    (a2)+        *loop time
  12512.     rts
  12513. *------------------------------------------------------------------------------
  12514. master_fader_ad:                    *ADPCM フェーダー
  12515.     bsr    get_mstr_fader
  12516.     bra    next_cmd_ad
  12517.  
  12518. master_fader_md:                    *MIDI フェーダー
  12519.     bsr    get_mstr_fader
  12520.     bset.b    #pts_volume,p_timbre_set(a5)    *音量設定フラグオン
  12521.     bra    next_cmd_md
  12522.  
  12523. master_fader_fm:                    *FM フェーダー
  12524.     pea    next_cmd_fm(pc)
  12525.  
  12526. get_mstr_fader:                    *マスターフェーダー設定
  12527.     move.b    (a0)+,d2
  12528.     lsl.w    #8,d2
  12529.     move.b    (a0)+,d2        *get control device ID
  12530.     cmpi.w    #-1,d2
  12531.     beq    master_fader_all
  12532.  
  12533.     bsr    mfd_odr_no        *> d3.w=ID
  12534.     bmi    smf_dead        *dead device case
  12535. set_mstrfdrprm:
  12536.     move.b    (a0)+,d5        *omt
  12537.     lea    mstfd_fm_spd2-work(a6),a2
  12538.     add.w    d3,a2
  12539.     lea    master_fader_tbl-work(a6),a1    *パラメータがだぶらないようにチェック
  12540.     ori.b    #ff_master_fader,fader_flag-work(a6)    *faderマーク
  12541. @@:
  12542.     move.w    (a1)+,d1
  12543.     bmi    @f
  12544.     cmp.w    d1,d3
  12545.     bne    @b
  12546.     bra    do_set_mstrfdrprm    *既存のパラメータ書き換えケース
  12547. @@:                    *新規にオーダーに追加
  12548.     tst.b    d5            *omt=0ならなにもしない
  12549.     beq    exit_gmf
  12550.     st.b    (a1)
  12551.     move.w    d3,-(a1)            *IDをテーブルにセット
  12552.                         *デフォルト値セット
  12553.     move.l    #fader_dflt_spd,fd_spd2(a2)    *set fd_spd2,fd_spd
  12554.     move.l    #$007f_0000,fd_lvlw(a2)        *fd_lvlw,fd_dest
  12555. do_set_mstrfdrprm:
  12556.     tst.b    d5            *omt=0ならばフェーダー解除用パラメータを設定する
  12557.     beq    off_mstfdr
  12558.     lsr.b    #1,d5            *chk omt
  12559.     bcc    @f
  12560.     moveq.l    #0,d0
  12561.     move.b    (a0)+,d0
  12562.     lsl.w    #8,d0
  12563.     move.b    (a0)+,d0
  12564.     move.l    d0,fd_spd2(a2)        *set fd_spd2,fd_spd
  12565. @@:
  12566.     lsr.b    #1,d5            *chk omt
  12567.     bcc    @f
  12568.     move.b    (a0)+,fd_lvlb(a2)    *set source level
  12569. @@:
  12570.     lsr.b    #1,d5            *chk omt
  12571.     bcc    @f
  12572.     move.b    (a0)+,fd_dest(a2)    *set destination level
  12573. @@:
  12574.     add.w    d3,d3                *今回の発音からフェーダー計算させるため
  12575.     lea    fo_ch_fm-work(a6,d3.w),a1
  12576.     move.l    #$2222_2222,d3
  12577.     or.l    d3,(a1)+
  12578.     or.l    d3,(a1)+
  12579.     or.l    d3,(a1)+
  12580.     or.l    d3,(a1)+
  12581.  
  12582.     move.b    fd_lvlb(a2),d0        *set source level
  12583.     cmp.b    fd_dest(a2),d0
  12584.     bhi    gmf00
  12585.     beq    @f
  12586.     move.b    #$01,fd_mode(a2)    *f.i. mode on
  12587.     rts
  12588. gmf00:
  12589.     st.b    fd_mode(a2)        *f.o. mode on
  12590.     rts
  12591. @@:
  12592.     tst.b    d0
  12593.     bpl    @f            *start=128,end=128ならフェーダー終了
  12594.     move.b    #MASTER_FADER_RESET,fd_mode(a2)
  12595.     rts
  12596. @@:
  12597.     clr.b    fd_mode(a2)
  12598. exit_gmf:
  12599.     rts
  12600.  
  12601. master_fader_all:            *dev=-1:全デバイスにフェーダーパラメータを設定
  12602.     move.l    a0,d6            *save
  12603.     moveq.l    #0,d3            *FM
  12604.     bsr    set_mstrfdrprm
  12605.     move.l    a0,-(sp)
  12606.     move.l    d6,a0
  12607.     moveq.l    #8,d3            *ADPCM
  12608.     bsr    set_mstrfdrprm
  12609.     moveq.l    #if_max-1,d2
  12610. mstfdal_lp:
  12611.     move.l    d6,a0
  12612.     bsr    get_midimfid        *>d3.w=mstr fader tbl ID
  12613.     bmi    @f
  12614.     bsr    set_mstrfdrprm
  12615. @@:
  12616.     dbra    d2,mstfdal_lp
  12617.     move.l    (sp)+,a0
  12618.     rts
  12619.  
  12620. off_mstfdr:                *omt=0(強制フェーダー解除)
  12621. off_chfdr:                *omt=0(強制フェーダー解除)
  12622.     move.l    #-1,fd_spd2(a2)        *set fd_spd2,fd_spd
  12623.     move.w    #128,fd_lvlw(a2)    *fd_lvlw
  12624.     rts
  12625.  
  12626. mfd_odr_no:
  12627.     * < d2.w=デバイスID
  12628.     * > d3.w=マスターフェーダーテーブルID
  12629.     * > minus=error
  12630.     * x d2,a4
  12631.     moveq.l    #0,d3
  12632.     tst.w    d2
  12633.     beq    exit_mfon
  12634.     bmi    @f            *plus:ADPCM | minus:MIDI
  12635.     moveq.l    #8,d3
  12636.     bra    exit_mfon
  12637. @@:
  12638.     ext.w    d2
  12639. get_midimfid:
  12640.     moveq.l    #0,d3
  12641.     lea    midi_if_tbl-work(a6),a4    *MIDI dev tbl
  12642.     move.b    (a4,d2.w),d3
  12643.     bmi    @f            *dead
  12644.     addq.w    #4,d3
  12645.     lsl.w    #2,d3            *MIDI1,2,3
  12646. exit_mfon:
  12647.     clr.l    fader_result-work(a6)
  12648.     rts
  12649. @@:
  12650.     move.l    #-1,fader_result-work(a6)    *Nフラグ立てるため
  12651.     rts
  12652. *------------------------------------------------------------------------------
  12653. ch_fader_ad:                    *ADPCM フェーダー
  12654.     bsr    get_fader
  12655.     bra    next_cmd_ad
  12656.  
  12657. ch_fader_md:                    *MIDI フェーダー
  12658.     bsr    get_fader
  12659.     bset.b    #pts_volume,p_timbre_set(a5)    *音量設定フラグオン
  12660.     bra    next_cmd_md
  12661.  
  12662. ch_fader_fm:                    *FM フェーダー
  12663.     pea    next_cmd_fm(pc)
  12664.  
  12665. get_fader:                    *フェーダーパラメータ取りだし
  12666.     move.b    (a0)+,d0        *type
  12667.     lsl.w    #8,d0
  12668.     move.b    (a0)+,d0
  12669.     cmpi.w    #-1,d0
  12670.     beq    chfdr_all_dev
  12671.     cmpi.w    #$7fff,d0
  12672.     beq    chfdr_track_mode1
  12673.     cmpi.w    #$7ffe,d0
  12674.     beq    chfdr_track_mode2
  12675.     cmpi.w    #$7ffd,d0
  12676.     bne    @f
  12677.     move.w    p_type(a5),d0        *このトラックのMIDI I/FのチャンネルX
  12678.     bpl    1f
  12679.     swap    d0            *カレントMIDI
  12680.     move.b    (a0)+,d0        *ch
  12681.     lsl.w    #8,d0
  12682.     move.b    (a0)+,d0
  12683.     cmpi.w    #-1,d0
  12684.     beq    chfdr_all_ch
  12685.     bsr    ch_odr_no_abs            *< d0.l=type,ch
  12686.     bpl    chkset_ch_fdr
  12687.     bra    chf_dead
  12688. 1:
  12689.     addq.w    #2,a0
  12690.     bra    chf_dead
  12691. @@:
  12692.     swap    d0
  12693.     move.b    (a0)+,d0        *ch
  12694.     lsl.w    #8,d0
  12695.     move.b    (a0)+,d0
  12696.     cmpi.w    #-1,d0
  12697.     beq    chfdr_all_ch
  12698.     bsr    ch_odr_no            *< d0.l=type,ch
  12699.     bpl    chkset_ch_fdr
  12700. chf_dead:
  12701. smf_dead:                *死んでいた場合はスピードなどのパラメータを読み飛ばす
  12702.     move.b    (a0)+,d0        *get omt
  12703.     beq    exit_smf_dead
  12704.     lsr.b    #1,d0            *check omt
  12705.     bcc    @f
  12706.     addq.w    #2,a0            *speed.w
  12707. @@:
  12708.     rept    2
  12709.     lsr.b    #1,d0            *check omt
  12710.     bcc    @f
  12711.     addq.w    #1,a0
  12712. @@:
  12713.     endm
  12714. exit_smf_dead:
  12715.     rts
  12716.  
  12717. chfdr_all_ch:                    *全チャンネルのフェーダー設定
  12718.     clr.w    d0
  12719.     bsr    ch_odr_no            * > d5.w=ch fader tbl (base) id
  12720.     bmi    chf_dead
  12721.     moveq.l    #16-1,d6
  12722.     move.l    a0,d7
  12723. @@:
  12724.     move.l    d7,a0
  12725.     bsr    chkset_ch_fdr
  12726.     addq.w    #1,d5
  12727.     dbra    d6,@b
  12728. exit_cad:
  12729. exit_cftr2:
  12730.     rts
  12731.  
  12732. chfdr_all_dev:                    *全デバイスのチャンネルnに対してフェーダー設定
  12733.     swap    d0
  12734.     move.b    (a0)+,d0            *ch
  12735.     lsl.w    #8,d0
  12736.     move.b    (a0)+,d0
  12737.     move.l    a0,d7
  12738.     cmpi.w    #-1,d0
  12739.     beq    chfdr_all_dev_all_ch
  12740.     move.l    d0,d5                *d5.w=ch
  12741.     bsr    chkset_ch_fdr            *FM
  12742.     add.w    #16,d5
  12743.     move.l    d7,a0
  12744.     bsr    chkset_ch_fdr            *ADPCM
  12745.  
  12746.     lea    midi_if_tbl-work(a6),a4
  12747.     add.w    #16,d5
  12748.     move.w    d5,d6
  12749. @@:
  12750.     moveq.l    #0,d5
  12751.     move.b    (a4)+,d5        *d5=0,2,4,6
  12752.     bmi    exit_cad
  12753.     lsl.w    #3,d5            *16倍
  12754.     add.w    d6,d5
  12755.     move.l    d7,a0
  12756.     bsr    chkset_ch_fdr
  12757.     bra    @b
  12758.  
  12759. chfdr_all_dev_all_ch:                *全デバイス全チャンネルフェーダー
  12760.     moveq.l    #8-1,d6
  12761.     moveq.l    #0,d5
  12762. @@:                        *FMのフェーダー
  12763.     move.l    d7,a0
  12764.     bsr    chkset_ch_fdr
  12765.     addq.w    #1,d5
  12766.     dbra    d6,@b
  12767.  
  12768.     moveq.l    #16,d5
  12769.     moveq.l    #16-1,d6
  12770. @@:                        *ADPCMのフェーダー
  12771.     move.l    d7,a0
  12772.     bsr    chkset_ch_fdr
  12773.     addq.w    #1,d5
  12774.     dbra    d6,@b
  12775.  
  12776.     moveq.l    #if_max-1,d2
  12777.     lea    midi_if_tbl-work(a6),a4
  12778. cadac_lp:
  12779.     moveq.l    #0,d5
  12780.     move.b    (a4,d2.w),d5
  12781.     bmi    next_cadac
  12782.     addq.w    #4,d5
  12783.     lsl.w    #3,d5                *2*2^3=16倍
  12784.     moveq.l    #16-1,d6
  12785. @@:                        *MIDIのフェーダー
  12786.     move.l    d7,a0
  12787.     bsr    chkset_ch_fdr
  12788.     addq.w    #1,d5
  12789.     dbra    d6,@b
  12790. next_cadac:
  12791.     dbra    d2,cadac_lp
  12792.     rts
  12793.  
  12794. chfdr_track_mode1:                *トラックモード1(純粋なトラック指定)
  12795.     move.l    seq_wk_tbl_se-work(a6),a1
  12796.     btst.b    #_ID_SE,p_track_stat(a5)
  12797.     bne    @f
  12798. do_chfdr_track_mode1:                *< fnc$5b
  12799.     move.l    seq_wk_tbl-work(a6),a1
  12800. @@:
  12801.     moveq.l    #0,d0
  12802.     move.b    (a0)+,d0
  12803.     lsl.w    #8,d0
  12804.     move.b    (a0)+,d0
  12805.     cmpi.w    #-1,d0
  12806.     beq    1f
  12807.     swap    d0
  12808.     lsr.l    #16-trwk_size_,d0
  12809.     adda.l    d0,a1
  12810.     tst.b    p_track_stat(a1)    *死んでるトラックは再演奏不可
  12811.     bmi    chf_dead
  12812.     move.l    p_type(a1),d0
  12813.     bsr    ch_odr_no_abs            *チャンネルフェーダーパラメータへ変換(>d5.w)
  12814.     bpl    chkset_ch_fdr
  12815.     bra    chf_dead
  12816.  
  12817. chfdr_track_mode2:                *トラックモード2
  12818.     move.b    (a0)+,d0
  12819.     lsl.w    #8,d0
  12820.     move.b    (a0)+,d0
  12821.     tst.w    d0
  12822.     beq    chfdr_this_track        *このトラック
  12823.     cmpi.w    #-1,d0
  12824.     bne    chf_dead            *unknown ID
  12825. 1:
  12826.     move.l    play_trk_tbl_se-work(a6),a1
  12827.     move.l    seq_wk_tbl_se-work(a6),a2
  12828.     btst.b    #_ID_SE,p_track_stat(a5)
  12829.     bne    @f
  12830. do_chfdr_track_mode2:
  12831.     move.l    play_trk_tbl-work(a6),a1
  12832.     move.l    seq_wk_tbl-work(a6),a2
  12833. @@:
  12834.     move.l    a0,d7                *以下全トラック
  12835. @@:
  12836.     moveq.l    #0,d0
  12837.     move.w    (a1)+,d0
  12838.     bmi    exit_cftr2
  12839.     swap    d0
  12840.     lsr.l    #16-trwk_size_,d0
  12841.     tst.b    p_track_stat(a2,d0.l)    *死んでるトラックは再演奏不可
  12842.     bmi    @b
  12843.     move.l    p_type(a2,d0.l),d0
  12844.     bsr    ch_odr_no_abs        *チャンネルフェーダーパラメータへ変換(>d5.w)
  12845.     bmi    @b
  12846.     move.l    d7,a0
  12847.     bsr    chkset_ch_fdr
  12848.     bra    @b
  12849.  
  12850. chfdr_this_track:
  12851.     move.l    d4,d0
  12852.     bsr    ch_odr_no_abs            *チャンネルフェーダーパラメータへ変換(>d5.w)
  12853.     bmi    chf_dead
  12854.  
  12855. chkset_ch_fdr:
  12856.     * < d5.w=ch_fader tbl ID(0-95)
  12857.     * x d0,d3
  12858. reglist    reg    a1-a2
  12859.     movem.l    reglist,-(sp)
  12860.     move.b    (a0)+,d3        *omt
  12861.     move.w    d5,d0
  12862.     lsl.w    #fd_wkl_,d0
  12863.     lea    ch_fm_fdp-work(a6),a2
  12864.     adda.w    d0,a2            *ch_xx_fdp n
  12865.     lea    ch_fader_tbl-work(a6),a1
  12866.     ori.b    #ff_ch_fader,fader_flag-work(a6)    *faderマーク
  12867. @@:
  12868.     move.w    (a1)+,d0
  12869.     bmi    @f
  12870.     cmp.w    d0,d5
  12871.     bne    @b
  12872.     bra    do_set_chfdrprm        *既存のパラメータ書き換えケース
  12873. @@:                    *新規にオーダー追加
  12874.     tst.b    d3
  12875.     beq    exit_gcf
  12876.     st.b    (a1)
  12877.     move.w    d5,-(a1)
  12878.                         *デフォルト値セット
  12879.     move.l    #fader_dflt_spd,fd_spd2(a2)    *set fd_spd2,fd_spd
  12880.     move.l    #$007f_0000,fd_lvlw(a2)        *fd_lvlw,fd_dest
  12881. do_set_chfdrprm:
  12882.     tst.b    d3            *omt=0ならばフェーダー解除用のパラメータを設定する
  12883.     beq    off_chfdr
  12884.     lsr.b    #1,d3            *chk omt
  12885.     bcc    @f
  12886.     moveq.l    #0,d0
  12887.     move.b    (a0)+,d0
  12888.     lsl.w    #8,d0
  12889.     move.b    (a0)+,d0
  12890.     move.l    d0,fd_spd2(a2)        *set fd_spd2,fd_spd
  12891. @@:
  12892.     lsr.b    #1,d3            *chk omt
  12893.     bcc    @f
  12894.     move.b    (a0)+,fd_lvlb(a2)    *set source level
  12895. @@:
  12896.     lsr.b    #1,d3            *chk omt
  12897.     bcc    @f
  12898.     move.b    (a0)+,fd_dest(a2)    *set destination level
  12899. @@:
  12900.     ori.b    #$41,fo_ch_fm-work(a6,d5.w)    *今回の発音からフェーダー計算させるため
  12901.     move.b    fd_lvlb(a2),d0        *set source level
  12902.     cmp.b    fd_dest(a2),d0
  12903.     bhi    gcf00
  12904.     beq    @f
  12905.     move.b    #$01,fd_mode(a2)    *f.i. mode on
  12906.     movem.l    (sp)+,reglist
  12907.     rts
  12908. gcf00:
  12909.     st.b    fd_mode(a2)        *f.o. mode on
  12910.     movem.l    (sp)+,reglist
  12911.     rts
  12912. @@:
  12913.     tst.b    d0
  12914.     bpl    @f
  12915.     move.b    #CH_FADER_RESET,fd_mode(a2)
  12916.     movem.l    (sp)+,reglist
  12917.     rts
  12918. @@:
  12919.     clr.b    fd_mode(a2)
  12920. exit_gcf:
  12921.     movem.l    (sp)+,reglist
  12922.     rts
  12923.  
  12924. ch_odr_no_abs:
  12925.     * < d0.hw=type,d0.lw=ch
  12926.     * x a4
  12927.     * > d5.w=チャンネルフェーダーテーブル用オーダー値
  12928.     * > minusはエラー
  12929.     swap    d0
  12930.     tst.w    d0
  12931.     beq    con_fm
  12932.     bmi    con_midi
  12933.                 *ADPCM
  12934.     moveq.l    #16,d5
  12935.     swap    d0
  12936.     add.w    d0,d5
  12937.     rts
  12938.  
  12939. con_fm:                *FM
  12940.     swap    d0
  12941.     move.w    d0,d5
  12942.     rts
  12943.  
  12944. con_midi:            *MIDI
  12945.     btst.b    d0,midi_board-work(a6)
  12946.     beq    @f        *未装着デバイス
  12947.     moveq.l    #32,d5
  12948.     lsl.w    #4,d0        *16倍
  12949.     add.w    d0,d5
  12950.     swap    d0
  12951.     add.w    d0,d5
  12952.     clr.l    fader_result-work(a6)
  12953.     rts
  12954. @@:
  12955.     move.l    #-1,fader_result-work(a6)    *Nフラグ立てるため
  12956.     rts
  12957.  
  12958. ch_odr_no:
  12959.     * < d0.hw=type,d0.lw=ch
  12960.     * x a4
  12961.     * > d5.w=チャンネルフェーダーテーブル用オーダー値
  12962.     * > minusはエラー
  12963.     swap    d0
  12964.     tst.w    d0
  12965.     beq    _con_fm
  12966.     bmi    _con_midi
  12967.                 *ADPCM
  12968.     moveq.l    #16,d5
  12969.     swap    d0
  12970.     add.w    d0,d5
  12971.     rts
  12972.  
  12973. _con_fm:                *FM
  12974.     swap    d0
  12975.     move.w    d0,d5
  12976.     rts
  12977.  
  12978. _con_midi:            *MIDI
  12979.     moveq.l    #32,d5
  12980.     ext.w    d0        *最上位殺す
  12981.     lea    midi_if_tbl-work(a6),a4
  12982.     move.b    (a4,d0.w),d0    *既に2倍された値
  12983.     bmi    @f
  12984.     lsl.w    #4-1,d0        *16倍
  12985.     add.w    d0,d5
  12986.     swap    d0
  12987.     add.w    d0,d5
  12988.     clr.l    fader_result-work(a6)
  12989.     rts
  12990. @@:
  12991.     move.l    #-1,fader_result-work(a6)    *Nフラグ立てるため
  12992.     rts
  12993. *------------------------------------------------------------------------------
  12994. pcm_mode_ad:
  12995.     bclr.b    #b_vtune_mode,p_md_flg(a5)
  12996.     move.b    (a0)+,d0
  12997.     or.b    d0,p_md_flg(a5)
  12998.     bra    next_cmd_ad
  12999. *------------------------------------------------------------------------------
  13000. damper_md:                *MIDI ダンパーペダル
  13001.     move.b    (a0)+,d1
  13002.     move.b    d1,p_damper(a5)
  13003.     check_concur    MIDI_DMP
  13004.     bset.b    #pts_damper,p_timbre_set(a5)    *音量設定フラグオン
  13005.     bra    next_cmd_md
  13006.  
  13007. track_mode_fm:                *FM ノートオフなしモード
  13008.     moveq.l    #0,d1
  13009.     move.b    (a0)+,d0
  13010.     beq    @f
  13011.     moveq.l    #127,d1
  13012. @@:
  13013. *    move.b    d1,p_damper(a5)
  13014.     move.b    p_track_mode(a5),d2    *d2=previous
  13015.     andi.b    #$ff.and.(.not.ID_NO_KEYOFF),p_track_mode(a5)
  13016.     or.b    d0,p_track_mode(a5)
  13017.     bmi    next_cmd_fm
  13018.     bra    go_dokn2fm
  13019.  
  13020. damper_fm:                *FM ダンパーペダル
  13021.     moveq.l    #0,d0
  13022.     move.b    (a0)+,d1
  13023.     move.b    d1,p_damper(a5)
  13024.     cmpi.b    #64,d1
  13025.     bcs    @f
  13026.     moveq.l    #ID_NO_KEYOFF,d0
  13027. @@:
  13028.     move.b    p_track_mode(a5),d2    *d2=previous
  13029.     andi.b    #$ff.and.(.not.ID_NO_KEYOFF),p_track_mode(a5)
  13030.     or.b    d0,p_track_mode(a5)
  13031.     bmi    next_cmd_fm
  13032. go_dokn2fm:
  13033.     tst.b    d2            *もともとoffならなにもしない
  13034.     bpl    next_cmd_fm
  13035.     cmpi.b    #63,d1
  13036.     bhi    next_cmd_fm
  13037.     pea    next_cmd_fm(pc)
  13038.  
  13039. do_kn2_fm:                *ゲートタイム0のノートをキーオフ
  13040.     * < d4.l=type,ch
  13041.     * x d0-d2,d6/a1,a4
  13042. *    move.b    p_how_many(a5),d3    *!5/10
  13043. *    bmi    exit_kn2_fm        *!already all off
  13044.     move.w    p_voice_rsv(a5),d6    *loop counter
  13045.     lea    p_note(a5),a1
  13046.     moveq.l    #8,d1            *FM reg. number
  13047.     move.w    d4,d0
  13048.     move.l    p_opmset(a5),a4
  13049. fko2_lp_f:
  13050. *    tst.b    k_velo(a1)        *!k_velo=miならゲート0になったことがある
  13051. *    bpl    @f            *!
  13052.     tas.b    (a1)
  13053. *    bmi    @f            *!
  13054.     move.b    opm_kon-work(a6,d0.w),d2
  13055.     and.b    opm_nom-work(a6,d0.w),d2
  13056.     jsr    (a4)            *opmset(FM key off)
  13057.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  13058. *    subq.b    #1,d3            *!
  13059. @@:
  13060.     addq.w    #k_note_len,a1
  13061.     addq.b    #1,d0
  13062.     andi.b    #7,d0
  13063.     dbra    d6,fko2_lp_f
  13064. *    move.b    d3,p_how_many(a5)    *!all key off
  13065. exit_kn2_fm:
  13066.     rts
  13067.  
  13068. track_mode_ad:                *ADPCM ノートオフなしモード
  13069.     moveq.l    #0,d1
  13070.     move.b    (a0)+,d0
  13071.     beq    @f
  13072.     moveq.l    #127,d1
  13073. @@:
  13074. *    move.b    d1,p_damper(a5)
  13075.     move.b    p_track_mode(a5),d2    *d2=previous
  13076.     andi.b    #$ff.and.(.not.ID_NO_KEYOFF),p_track_mode(a5)
  13077.     or.b    d0,p_track_mode(a5)
  13078.     bmi    next_cmd_ad
  13079.     bra    go_dokn2ad
  13080.  
  13081. damper_ad:                *ADPCM ダンパーペダル
  13082.     moveq.l    #0,d0
  13083.     move.b    (a0)+,d1
  13084.     move.b    d1,p_damper(a5)
  13085.     cmpi.b    #64,d1
  13086.     bcs    @f
  13087.     moveq.l    #ID_NO_KEYOFF,d0
  13088. @@:
  13089.     move.b    p_track_mode(a5),d2    *d2=previous
  13090.     andi.b    #$ff.and.(.not.ID_NO_KEYOFF),p_track_mode(a5)
  13091.     or.b    d0,p_track_mode(a5)
  13092.     bmi    next_cmd_ad
  13093. go_dokn2ad:
  13094.     tst.b    d2
  13095.     bpl    next_cmd_ad
  13096.     cmpi.b    #63,d1
  13097.     bhi    next_cmd_ad
  13098.     pea    next_cmd_ad(pc)
  13099.  
  13100. do_kn2_ad:                *ゲートタイム0のノートをキーオフ
  13101. *    move.b    p_how_many(a5),d3    *!5/10
  13102. *    bmi    exit_kn2_ad        *!already all off
  13103.     move.w    p_voice_rsv(a5),d6    *loop counter
  13104.     lea    p_note(a5),a1
  13105.     moveq.l    #0,d5
  13106.     move.b    d4,d5
  13107. fko2_lp_a:
  13108. *    tst.b    k_velo(a1)        *!test velocity
  13109. *    bpl    @f            *!not 0
  13110.     tas.b    (a1)            *note.b
  13111. *    bmi    @f            *!
  13112.     move.l    d5,d0
  13113.     bsr    pcm_key_off
  13114.     bset.b    #b_keyoff,p_onoff_bit(a5)    *set key off bit
  13115. *    subq.b    #1,d3
  13116. @@:
  13117.     addq.w    #k_note_len,a1
  13118.     addq.b    #1,d5
  13119.     andi.b    #$0f,d5
  13120.     dbra    d6,fko2_lp_a
  13121. *    move.b    d3,p_how_many(a5)    *!
  13122. exit_kn2_ad:
  13123.     rts
  13124.  
  13125. track_mode_md:
  13126.     move.b    (a0)+,d0
  13127.     andi.b    #$ff.and.(.not.ID_NO_KEYOFF),p_track_mode(a5)
  13128.     or.b    d0,p_track_mode(a5)
  13129.     bra    next_cmd_md
  13130. *------------------------------------------------------------------------------
  13131. bend_range_md:            *ベンドレンジ切り換え
  13132.     moveq.l    #$b0,d0
  13133.     add.b    d4,d0        *ctrl chg
  13134.     move.l    p_midi_trans(a5),a2
  13135.     jsr    (a2)
  13136.     moveq.l    #$64,d0
  13137.     jsr    (a2)        *RPN L
  13138.     moveq.l    #$00,d0
  13139.     jsr    (a2)
  13140.     moveq.l    #$65,d0
  13141.     jsr    (a2)        *RPN H
  13142.     moveq.l    #$00,d0
  13143.     jsr    (a2)
  13144.     moveq.l    #$06,d0
  13145.     jsr    (a2)        *data entry
  13146.     move.b    (a0)+,d0
  13147.     move.b    d0,p_@b_range(a5)
  13148.     jsr    (a2)
  13149.     bra    next_cmd_md
  13150. *------------------------------------------------------------------------------
  13151. timbre_set2:                *音色設定#2
  13152.     * > a2.l=p_midi_trans(a5)
  13153.     * X d0-d2
  13154.     move.l    p_midi_trans(a5),a2
  13155.     move.b    p_timbre_set(a5),d2
  13156.     beq    exit_tmbst2
  13157.     bpl    tmst2_prog
  13158.     move.b    p_bank_lsb(a5),d1
  13159.     bmi    @f
  13160.     moveq.l    #$b0,d0
  13161.     or.b    d4,d0
  13162.     jsr    (a2)
  13163.     moveq.l    #$20,d0        *bank LSB
  13164.     jsr    (a2)
  13165.     move.b    d1,d0
  13166.     jsr    (a2)
  13167.     move.b    p_bank_msb(a5),d1
  13168.     bmi    tmst2_prog
  13169.     bpl    ts2_0        *Running Status
  13170. @@:
  13171.     move.b    p_bank_msb(a5),d1
  13172.     bmi    tmst2_prog
  13173.     moveq.l    #$b0,d0
  13174.     or.b    d4,d0
  13175.     jsr    (a2)
  13176. ts2_0:
  13177.     moveq.l    #$00,d0        *bank MSB
  13178.     jsr    (a2)
  13179.     move.b    d1,d0
  13180.     jsr    (a2)        *BANK送信
  13181. tmst2_prog:
  13182.     add.b    d2,d2
  13183.     bpl    @f
  13184.     moveq.l    #$c0,d0
  13185.     or.b    d4,d0
  13186.     jsr    (a2)        *send pgm chg
  13187.     move.w    p_pgm(a5),d0
  13188.     jsr    (a2)
  13189. @@:
  13190.     andi.b    #%0011_1111,p_timbre_set(a5)    *pts_bank,pts_program=0
  13191. exit_tmbst2:
  13192.     rts
  13193.  
  13194. exclusive_md:            *エクスクルーシブデータ転送
  13195.     bsr    timbre_set2
  13196.     moveq.l    #$f0,d0
  13197.     jsr    (a2)
  13198.     move.b    (a0)+,d2
  13199.     cmpi.b    #MKID_ROLAND,d2    *ローランドフォーマット対応エクスクルーシブデータ転送
  13200.     beq    1f
  13201.     cmpi.b    #MKID_YAMAHA,d2    *ローランドフォーマット対応エクスクルーシブデータ転送
  13202.     bne    @f
  13203. 1:
  13204.     move.b    p_maker(a5),d0    *Maker ID
  13205.     jsr    (a2)
  13206.     move.b    p_device(a5),d0    *Device ID
  13207.     jsr    (a2)
  13208.     move.b    p_module(a5),d0    *Model ID
  13209.     jsr    (a2)
  13210.     cmpi.b    #MKID_ROLAND,d2    *ローランドフォーマット対応エクスクルーシブデータ転送
  13211.     bne    @f
  13212.     moveq.l    #$12,d0        *Command ID(ROLAND)
  13213.     jsr    (a2)
  13214. @@:
  13215.     moveq.l    #0,d0
  13216.     move.b    (a0)+,d0    *skip comment
  13217.     add.w    d0,a0
  13218.     moveq.l    #0,d3        *checksum
  13219.     move.b    (a0)+,d1
  13220.     lsl.w    #8,d1
  13221.     move.b    (a0)+,d1
  13222.     swap    d1
  13223.     move.b    (a0)+,d1
  13224.     lsl.w    #8,d1
  13225.     move.b    (a0)+,d1
  13226.     cmpi.b    #MKID_YAMAHA,d2
  13227.     bne    @f
  13228.     subq.l    #3,d1        *アドレス分のぞく
  13229.     move.w    d1,d0
  13230.     lsr.w    #7,d0
  13231.     add.b    d0,d3
  13232.     jsr    (a2)
  13233.     move.w    d1,d0
  13234.     andi.w    #$7f,d0
  13235.     add.b    d0,d3
  13236.     jsr    (a2)        *ヤマハは転送バイト数も送信
  13237.     addq.l    #3,d1        *もとにもどす
  13238. @@:
  13239.     move.b    (a0)+,d0
  13240.     add.b    d0,d3
  13241.     jsr    (a2)
  13242.     subq.l    #1,d1
  13243.     bne    @b
  13244.     cmpi.b    #MKID_ROLAND,d2    *ローランドフォーマット対応エクスクルーシブデータ転送
  13245.     beq    1f
  13246.     cmpi.b    #MKID_YAMAHA,d2    *ローランドフォーマット対応エクスクルーシブデータ転送
  13247.     bne    @f
  13248. 1:
  13249.     moveq.l    #$80,d0
  13250.     andi.b    #$7f,d3
  13251.     sub.b    d3,d0        *d0=Check sum value
  13252.     andi.b    #$7f,d0
  13253.     jsr    (a2)
  13254. @@:
  13255.     moveq.l    #$f7,d0        *end of exclusive
  13256.     jsr    (a2)
  13257.     bra    next_cmd_md
  13258. *------------------------------------------------------------------------------
  13259. ID_set_md:                *ID SET
  13260.     move.b    (a0)+,d0
  13261.     bmi    @f
  13262.     move.b    d0,p_maker(a5)
  13263. @@:
  13264.     move.b    (a0)+,d0
  13265.     bmi    @f
  13266.     move.b    d0,p_device(a5)
  13267. @@:
  13268.     move.b    (a0)+,d0
  13269.     bmi    next_cmd_md
  13270.     move.b    d0,p_module(a5)
  13271.     bra    next_cmd_md
  13272. *------------------------------------------------------------------------------
  13273. midi_transmission_md:            *生MIDIデータ転送
  13274.     bsr    timbre_set2
  13275.     moveq.l    #0,d0
  13276.     move.b    (a0)+,d0    *skip comment
  13277.     add.w    d0,a0
  13278.     move.b    (a0)+,d1
  13279.     lsl.w    #8,d1
  13280.     move.b    (a0)+,d1    *d1=number of data
  13281.     swap    d1
  13282.     move.b    (a0)+,d1
  13283.     lsl.w    #8,d1
  13284.     move.b    (a0)+,d1    *d1=number of data
  13285. @@:
  13286.     move.b    (a0)+,d0
  13287.     jsr    (a2)        *send first data
  13288.     subq.l    #1,d1
  13289.     bne    @b
  13290.     bra    next_cmd_md
  13291. *------------------------------------------------------------------------------
  13292. frq_chg_ad:            *@F 周波数切り換え
  13293.     move.b    (a0)+,d1
  13294.     move.b    d1,p_frq(a5)
  13295.     bsr    do_adpcm_frq
  13296.     bra    next_cmd_ad
  13297. *------------------------------------------------------------------------------
  13298. NRPN_md:            *@Yコマンド(SET DATA TO NRPN)
  13299.     moveq.l    #$b0,d0        *コントロールチェンジ
  13300.     or.b    d4,d0
  13301.     move.l    p_midi_trans(a5),a2
  13302.     jsr    (a2)
  13303.     moveq.l    #$63,d0        *NRPN H
  13304.     jsr    (a2)
  13305.     move.b    (a0)+,d0
  13306.     jsr    (a2)
  13307.  
  13308.     moveq.l    #$62,d0        *NRPN L
  13309.     jsr    (a2)
  13310.     move.b    (a0)+,d0
  13311.     jsr    (a2)
  13312.  
  13313.     moveq.l    #$06,d0
  13314.     jsr    (a2)
  13315.     move.b    (a0)+,d0
  13316.     bmi    @f
  13317.     jsr    (a2)        *H
  13318. @@:
  13319.     move.b    (a0)+,d1
  13320.     bmi    next_cmd_md    *L省略時
  13321.     moveq.l    #$26,d0
  13322.     jsr    (a2)
  13323.     move.b    d1,d0
  13324.     jsr    (a2)        *L
  13325.     bra    next_cmd_md
  13326. *------------------------------------------------------------------------------
  13327. effect_ctrl_md:            *@E effect control
  13328.     move.b    (a0)+,d2    *get omt.
  13329.     beq    next_cmd_md
  13330.     move.l    p_midi_trans(a5),a2
  13331.     move.l    p_maker(a5),d0
  13332.     andi.l    #$ff00_ff00,d0
  13333.     cmpi.l    #$4100_1600,d0
  13334.     beq    e_mt32        *MT32
  13335.                 *コントロールチェンジでコントロールする場合
  13336.     moveq.l    #$b0,d0        *d1=ctrl chg message
  13337.     or.b    d4,d0
  13338.     jsr    (a2)
  13339.     lea    p_effect1(a5),a1
  13340.     move.l    #$000f_cedb,d3    *$5b,$5d,$5e,$5c,$5fの順番でctrl番号を生成
  13341. ecmlp00:
  13342.     lsr.b    #1,d2
  13343.     bcc    @f
  13344.     move.b    d3,d0        *ctrl no.
  13345.     andi.b    #$0f,d0
  13346.     ori.b    #$50,d0
  13347.     jsr    (a2)
  13348.     move.b    (a0)+,d0
  13349.     move.b    d0,(a1)+    *value
  13350.     jsr    (a2)
  13351.     lsr.l    #4,d3
  13352.     tst.b    d2
  13353.     bne    ecmlp00
  13354.     bra    next_cmd_md
  13355. @@:
  13356.     addq.w    #1,a1
  13357.     lsr.l    #4,d3
  13358.     tst.b    d2
  13359.     bne    ecmlp00
  13360.     bra    next_cmd_md
  13361.  
  13362. e_mt32:
  13363.     move.l    #$0003_00_00,d1
  13364.     lsr.b    #1,d2        *dummy shift(必ず一個はパラメータがあるはずなので無条件シフト)
  13365.     move.b    (a0)+,d1    *get part number
  13366.     cmpi.b    #7,d1
  13367.     bls    @f
  13368.     move.b    #$10,d1        *8以上はrythm partとみなす
  13369. @@:
  13370.     lsl.w    #4,d1        *16倍
  13371.     addq.b    #6,d1        *reverb switch offset
  13372.  
  13373.     moveq.l    #$f0,d0        *exc
  13374.     jsr    (a2)
  13375.     moveq.l    #$41,d0        *maker
  13376.     jsr    (a2)
  13377.     move.b    p_device(a5),d0    *device
  13378.     jsr    (a2)
  13379.     moveq.l    #$16,d0        *module
  13380.     jsr    (a2)
  13381.     moveq.l    #$12,d0        *command
  13382.     jsr    (a2)
  13383.     moveq.l    #0,d3        *clr chk_sum
  13384.     swap    d1
  13385.     move.b    d1,d0
  13386.     add.b    d0,d3
  13387.     jsr    (a2)
  13388.     rept    2
  13389.     rol.l    #8,d1
  13390.     move.b    d1,d0
  13391.     add.b    d0,d3
  13392.     jsr    (a2)
  13393.     endm
  13394.     moveq.l    #0,d0        *default=0(OFF)
  13395.     lsr.b    #1,d2        *スイッチの値省略
  13396.     bcc    @f
  13397.     move.b    (a0)+,d0
  13398.     beq    @f
  13399.     moveq.l    #1,d0        *それ以外は1(ON)とする
  13400.     add.b    d0,d3
  13401. @@:
  13402.     jsr    (a2)
  13403.     andi.b    #$7f,d3
  13404.     moveq.l    #$80,d0
  13405.     sub.b    d3,d0
  13406.     andi.b    #$7f,d0
  13407.     jsr    (a2)        *check sum
  13408.     moveq.l    #$f7,d0        *end of EXC
  13409.     jsr    (a2)
  13410.     bsr    skip_by_d2    *残ったomt.bitを参照しa0を更新
  13411.     bra    next_cmd_md
  13412. *------------------------------------------------------------------------------
  13413. poke_md:                *ワーク直接書き換え直接
  13414.     bsr    do_poke
  13415.     bra    next_cmd_md
  13416.  
  13417. poke_ad:                *ワーク直接書き換え直接
  13418.     bsr    do_poke
  13419.     bra    next_cmd_ad
  13420.  
  13421. poke_fm:                *ワーク直接書き換え直接
  13422.     pea    next_cmd_fm(pc)
  13423.  
  13424. do_poke:
  13425.     moveq.l    #0,d0
  13426.     move.b    (a0)+,d0        *get mode
  13427.     move.l    d0,d1
  13428.     lsr.b    #4,d0
  13429.     moveq.l    #0,d2
  13430. @@:
  13431.     lsl.l    #8,d2
  13432.     move.b    (a0)+,d2        *get offset
  13433.     dbra    d0,@b
  13434.     andi.w    #$0f,d1
  13435.     move.l    d1,d0
  13436.     moveq.l    #0,d3
  13437. @@:
  13438.     lsl.l    #8,d3
  13439.     move.b    (a0)+,d3        *get data
  13440.     dbra    d0,@b
  13441.     move.b    dpjtbl(pc,d1.w),d1
  13442.     jmp    dpjtbl(pc,d1.w)
  13443. dpjtbl:
  13444.     dc.b    dpj_byte-dpjtbl        *0
  13445.     dc.b    dpj_word-dpjtbl        *1
  13446.     dc.b    @f-dpjtbl        *2
  13447.     dc.b    dpj_long-dpjtbl        *3
  13448. dpj_byte:
  13449.     move.b    d3,(a5,d2.l)
  13450. @@:
  13451.     rts
  13452. dpj_word:
  13453.     move.w    d3,(a5,d2.l)
  13454.     rts
  13455. dpj_long:
  13456.     move.l    d3,(a5,d2.l)
  13457.     rts
  13458. *------------------------------------------------------------------------------
  13459. rltv_poke_ad:                *ワーク直接書き換え相対
  13460.     bsr    do_rltv_poke
  13461.     bra    next_cmd_ad
  13462.  
  13463. rltv_poke_md:                *ワーク直接書き換え相対
  13464.     bsr    do_rltv_poke
  13465.     bra    next_cmd_md
  13466.  
  13467. rltv_poke_fm:                *ワーク直接書き換え相対
  13468.     pea    next_cmd_fm(pc)
  13469.  
  13470. do_rltv_poke:
  13471.     moveq.l    #0,d0
  13472.     move.b    (a0)+,d0        *get mode
  13473.     move.l    d0,d1
  13474.     lsr.b    #4,d0
  13475.     moveq.l    #0,d2
  13476. @@:
  13477.     move.b    (a0)+,d2        *get offset
  13478.     lsl.w    #8,d2
  13479.     dbra    d0,@b
  13480.     andi.w    #$0f,d1
  13481.     move.l    d1,d0
  13482.     moveq.l    #0,d3
  13483. @@:
  13484.     move.b    (a0)+,d3        *get data
  13485.     lsl.w    #8,d3
  13486.     dbra    d0,@b
  13487.     move.b    dprjtbl(pc,d1.w),d1
  13488.     jmp    dprjtbl(pc,d1.w)
  13489. dprjtbl:
  13490.     dc.b    dprj_byte-dprjtbl
  13491.     dc.b    dprj_word-dprjtbl
  13492. dprj_byte:
  13493.     tst.b    d2
  13494.     bmi    dprj_byte_minus
  13495.     add.b    d2,(a5,d3.w)
  13496.     bcs    @f
  13497.     rts
  13498. @@:
  13499.     st.b    (a5,d3.w)        *set max vlaue
  13500.     rts
  13501. dprj_byte_minus:
  13502.     add.b    d2,(a5,d3.w)
  13503.     bmi    @f
  13504.     rts
  13505. @@:
  13506.     clr.b    (a5,d3.w)
  13507.     rts
  13508.  
  13509. dprj_word:
  13510.     tst.w    d2
  13511.     bmi    dprj_word_minus
  13512.     add.w    d2,(a5,d3.w)
  13513.     bcs    @f
  13514.     rts
  13515. @@:
  13516.     move.w    #-1,(a5,d3.w)
  13517.     rts
  13518. dprj_word_minus:
  13519.     add.w    d2,(a5,d3.w)
  13520.     bmi    @f
  13521.     rts
  13522. @@:
  13523.     clr.w    (a5,d3.w)
  13524.     rts
  13525. *------------------------------------------------------------------------------
  13526. pmod_mode_md:            *MIDI PMODモード設定
  13527.     move.b    (a0)+,d0
  13528.     cmp.b    p_pmod_mode(a5),d0
  13529.     beq    next_cmd_md    *設定内容が同じならなにもしない
  13530. *!2/5    bclr.b    #b_pmod_first,p_pmod_flg(a5)
  13531.     move.b    d0,p_pmod_mode(a5)
  13532.     bmi    next_cmd_md
  13533.     tst.b    p_pmod_sw(a5)
  13534.     beq    next_cmd_md
  13535.     bsr    calc_pmod
  13536.     bra    next_cmd_md
  13537. *------------------------------------------------------------------------------
  13538. arcc_mode_md:            *MIDI ARCCモード設定
  13539.     bsr    get_arcc_a4
  13540.     move.b    (a0)+,d0
  13541.     cmp.b    p_arcc_mode(a4),d0
  13542.     beq    next_cmd_md
  13543. *!2/5    bclr.b    #b_arcc_first,p_arcc_flg(a4)
  13544.     move.b    d0,p_arcc_mode(a4)
  13545.     bmi    next_cmd_md
  13546.     tst.b    p_arcc_sw(a4)
  13547.     beq    next_cmd_md
  13548.     bsr    calc_arcc
  13549.     bra    next_cmd_md
  13550. *------------------------------------------------------------------------------
  13551. waiting_fm:                *Wコマンド(同期待ち)
  13552.     moveq.l    #1,d0
  13553.     tst.b    p_sync_wk(a5)        *同期待ちにするかどうかの決断
  13554.     bne    @f
  13555.     move.b    d0,p_sync_wk(a5)    *同期待ちにせず初期状態に戻してリターン
  13556.     bra    next_cmd_fm
  13557. @@:
  13558.     ori.b    #ID_SYNC,p_track_stat(a5)
  13559.     move.w    d0,(a5)            *step time=1
  13560.     st.b    p_sync_wk(a5)        *waiting
  13561.     rts
  13562.  
  13563. waiting_ad:                *Wコマンド(同期待ち)
  13564.     moveq.l    #1,d0
  13565.     tst.b    p_sync_wk(a5)        *同期待ちにするかどうかの決断
  13566.     bne    @f
  13567.     move.b    d0,p_sync_wk(a5)    *同期待ちにせず初期状態に戻してリターン
  13568.     bra    next_cmd_ad
  13569. @@:
  13570.     ori.b    #ID_SYNC,p_track_stat(a5)
  13571.     move.w    d0,(a5)            *step time=1
  13572.     st.b    p_sync_wk(a5)        *waiting
  13573.     rts
  13574.  
  13575. waiting_md:                *Wコマンド(同期待ち)
  13576.     moveq.l    #1,d0
  13577.     tst.b    p_sync_wk(a5)        *同期待ちにするかどうかの決断
  13578.     bne    @f
  13579.     move.b    d0,p_sync_wk(a5)    *同期待ちにせず初期状態に戻してリターン
  13580.     bra    next_cmd_md
  13581. @@:
  13582.     ori.b    #ID_SYNC,p_track_stat(a5)
  13583.     move.w    d0,(a5)            *step time=1
  13584.     st.b    p_sync_wk(a5)        *waiting
  13585.     rts
  13586. *------------------------------------------------------------------------------
  13587. send_sync_md:            *MIDI 同期送信
  13588.     bsr    do_send_sync
  13589.     bra    next_cmd_md
  13590.  
  13591. send_sync_ad:            *ADPCM 同期送信
  13592.     bsr    do_send_sync
  13593.     bra    next_cmd_ad
  13594.  
  13595. send_sync_fm:            *FM 同期送信
  13596.     pea    next_cmd_fm(pc)
  13597.  
  13598. do_send_sync:            *同期送信コマンドパラメータ取りだし
  13599.     moveq.l    #0,d0
  13600.     move.b    (a0)+,d0    *get tr number
  13601.     lsl.w    #8,d0
  13602.     move.b    (a0)+,d0
  13603.     cmp.w    trk_n_max-work(a6),d0
  13604.     bhi    exit_dss
  13605.     swap    d0
  13606.     lsr.l    #16-trwk_size_,d0
  13607.     move.l    seq_wk_tbl-work(a6),a1
  13608.     btst.b    #_ID_SE,p_track_stat(a5)
  13609.     beq    @f
  13610.     move.l    seq_wk_tbl_se-work(a6),a1
  13611. @@:
  13612.     adda.l    d0,a1
  13613.     bclr.b    #_ID_SYNC,p_track_stat(a1)
  13614.     bne    @f
  13615.     clr.b    p_sync_wk(a1)
  13616.     rts
  13617. @@:                    *同期信号によって再演奏開始した場合
  13618.     move.l    p_total(a5),p_total(a1)    *jumpコマンドに対応するため
  13619. exit_dss:
  13620.     rts
  13621. *------------------------------------------------------------------------------
  13622. forceplay_ad:            *ADPCM 強制再演奏
  13623.     bsr    do_forceplay
  13624.     bra    next_cmd_ad
  13625.  
  13626. forceplay_md:            *MIDI 強制再演奏
  13627.     bsr    do_forceplay
  13628.     bra    next_cmd_md
  13629.  
  13630. forceplay_fm:            *FM 強制再演奏
  13631.     pea    next_cmd_fm(pc)
  13632.  
  13633. do_forceplay:                *強制再演奏
  13634.     * d0,d1,a2,a4
  13635.     moveq.l    #0,d0
  13636.     move.b    (a0)+,d0
  13637.     lsl.w    #8,d0
  13638.     move.b    (a0)+,d0
  13639.     move.l    d0,d1
  13640.     move.l    seq_wk_tbl-work(a6),a1
  13641.     movea.l    trk_po_tbl-work(a6),a2
  13642.     btst.b    #_ID_SE,p_track_stat(a5)
  13643.     beq    @f
  13644.     move.l    seq_wk_tbl_se-work(a6),a1
  13645.     movea.l    trk_po_tbl_se-work(a6),a2
  13646. @@:
  13647.     swap    d0
  13648.     lsr.l    #16-trwk_size_,d0
  13649.     adda.l    d0,a1
  13650.     tst.b    p_track_stat(a1)    *死んでるトラックは再演奏不可
  13651.     bmi    @f
  13652.     movem.l    d4/a5,-(sp)
  13653.     move.l    a1,a5
  13654.     move.w    #$0001,(a1)+        *dummy step time
  13655.     lsl.l    #trk_tbl_size_,d1
  13656.     add.l    d1,a2
  13657.     move.l    (a2)+,(a1)+        *p_track_stat,p_track_mode,p_trkfrq,p_trkfrq_wk
  13658.     move.l    (a2)+,d4
  13659.     move.l    d4,(a1)+        *p_type,p_ch
  13660.     jsr    _ms_key_off
  13661.     add.l    (a2)+,a4
  13662.     move.l    a4,(a1)+        *p_data_pointer
  13663.     jsr    init_wks2
  13664.     movem.l    (sp)+,d4/a5
  13665. @@:
  13666.     rts
  13667. *------------------------------------------------------------------------------
  13668. timbre_split_fm:        *FM 音色スプリット
  13669.     pea    next_cmd_fm(pc)
  13670.     bra    get_timbre_split_param
  13671.  
  13672. timbre_split_md:        *MIDI 音色スプリット
  13673.     pea    next_cmd_md(pc)
  13674.     bra    get_timbre_split_param
  13675.  
  13676. timbre_split_ad:        *ADPCM 音色スプリット
  13677.     pea    next_cmd_ad(pc)
  13678.  
  13679. get_timbre_split_param:
  13680.     bclr.b    #b_split_mode,p_md_flg(a5)
  13681.     move.b    (a0)+,d0    *get num of param(0-8)
  13682.     bpl    @f        *最上位ビットはSPLITスイッチ
  13683.     tas.b    p_md_flg(a5)    *bset.b    #b_split_mode,p_md_flg(a5)
  13684. @@:
  13685.     add.b    d0,d0        *最上位ビット殺す
  13686.     beq    exit_gtsp
  13687.     lea    p_split_tbl(a5),a1
  13688. @@:
  13689.     move.b    (a0)+,(a1)+    *start note
  13690.     move.b    (a0)+,(a1)+    *end note
  13691.     move.b    (a0)+,(a1)+    *bank.w
  13692.     move.b    (a0)+,(a1)+
  13693.     move.b    (a0)+,(a1)+    *timbre.w
  13694.     move.b    (a0)+,(a1)+
  13695.     subq.b    #2,d0
  13696.     bne    @b
  13697. exit_gtsp:
  13698.     rts
  13699. *------------------------------------------------------------------------------
  13700. slot_mask_fm:            *FM スロットマスクの切り換え
  13701.     move.b    (a0)+,d0
  13702.     beq    @f
  13703.                 *mode start
  13704.     bset.b    #b_slot_mask,p_md_flg(a5)
  13705.     move.b    p_om(a5),p_om_bak(a5)
  13706.     move.b    d0,p_om(a5)
  13707.     not.b    d0
  13708.     move.b    d0,opm_nom-work(a6,d4.w)
  13709.     bra    next_cmd_fm
  13710. @@:                *mode off
  13711.     bclr.b    #b_slot_mask,p_md_flg(a5)
  13712.     move.b    p_om_bak(a5),d0
  13713.     move.b    d0,p_om(a5)
  13714.     not.b    d0
  13715.     move.b    d0,opm_nom-work(a6,d4.w)
  13716.     bra    next_cmd_fm
  13717.  
  13718. timbre_fm:            *FM 音色切り換え
  13719.     moveq.l    #0,d0
  13720.     move.b    (a0)+,d0
  13721.     lsl.w    #8,d0
  13722.     move.b    (a0)+,d0
  13723.     move.w    d0,p_pgm(a5)
  13724.     move.b    p_bank_msb(a5),d1
  13725.     ext.w    d1
  13726.     bmi    @f
  13727.     lsl.w    #7,d1
  13728.     move.b    p_bank_lsb(a5),d2
  13729.     bmi    @f
  13730.     or.b    d2,d1
  13731.     lsl.w    #7,d1
  13732.     add.w    d1,d0        *バンク考慮
  13733. @@:
  13734.     moveq.l    #0,d1
  13735.     move.b    p_next_on(a5),d1
  13736.     cmp.w    p_voice_rsv(a5),d1
  13737.     bls    @f
  13738.     moveq.l    #0,d1
  13739. @@:
  13740.     clr.b    p_tone_set(a5)
  13741.     bset.b    d1,p_tone_set(a5)
  13742.     add.w    d1,d4
  13743.     andi.w    #$07,d4
  13744.     move.w    d4,d1
  13745.     add.w    d1,d1
  13746.     move.l    (a6),a1
  13747.     lea    fm_tone_set-work(a6),a4
  13748.     move.w    -(a1),(a4,d1.w)
  13749.     move.b    d4,p_timbre_src(a5)
  13750.     bsr    fmvset
  13751.     move.w    p_ch(a5),d4
  13752.     bra    next_cmd_fm
  13753.  
  13754. init_rr:
  13755.     moveq.l    #$e0,d1
  13756.     add.b    d4,d1
  13757.     moveq.l    #$ff,d2
  13758.     moveq.l    #4-1,d0
  13759. @@:
  13760.     jsr    (a4)
  13761.     addq.b    #8,d1
  13762.     dbra    d0,@b
  13763.  
  13764.     moveq.l    #$60,d1
  13765.     add.b    d4,d1
  13766.     moveq.l    #4-1,d0
  13767. @@:
  13768.     jsr    (a4)
  13769.     addq.b    #8,d1
  13770.     dbra    d0,@b
  13771.     rts
  13772.  
  13773. fmvset:                *FM音色のセット
  13774.     * < d0.l=sound number(0~32767)
  13775.     * < d4.w=ch
  13776.     * < a5=seq_wk_tbl n
  13777.     * - all
  13778.     * x a4
  13779. reglist    reg    d0-d3/a1/a4
  13780.     cmp.w    fmsnd_n_max-work(a6),d0
  13781.     bcc    _exit_fmvset
  13782.     movem.l    reglist,-(sp)
  13783.     lsl.l    #4,d0
  13784.     move.l    d0,d1
  13785.     add.l    d0,d0
  13786.     add.l    d1,d0        *fmsnd_size倍
  13787.     movea.l    fmsnd_buffer-work(a6),a1
  13788.     adda.l    d0,a1
  13789.     tst.w    (a1)+
  13790.     beq    exit_fmvset
  13791.     move.l    p_opmset(a5),a4
  13792.     bsr    init_rr
  13793.     bsr    swk_copy    *アウトプットレベル等のワークへのコピー
  13794.  
  13795.     moveq.l    #$18,d1
  13796.     move.b    (a1)+,d2    *0)LFRQ
  13797.     jsr    (a4)        *opmset
  13798.  
  13799.     moveq.l    #$19,d1
  13800.     move.b    (a1)+,d2    *1)PMD/F=1
  13801.     jsr    (a4)        *opmset
  13802.     move.b    (a1)+,d2    *2)AMD/F=0
  13803.     jsr    (a4)        *opmset
  13804.  
  13805.     move.b    (a1)+,d2    *3)SYNC/OM/WF
  13806.     smi.b    p_sync(a5)
  13807.     andi.b    #$03,d2        *get only WF
  13808.     move.w    sr,-(sp)
  13809.     ori.w    #$0700,sr
  13810.     move.b    OPMCTRL.w,d1
  13811.     andi.b    #$fc,d1
  13812.     or.b    d1,d2
  13813.     moveq.l    #$1b,d1
  13814.     jsr    (a4)        *opmset
  13815.     move.w    (sp)+,sr
  13816.  
  13817.     moveq.l    #$20,d1
  13818.     or.b    d4,d1        *$20+n
  13819.     move.b    (a1)+,d2    *4)PAN/AF
  13820.     jsr    (a4)        *opmset
  13821.     rol.b    #2,d2
  13822.     andi.w    #3,d2
  13823.     move.b    _pan_tbl_(pc,d2.w),p_pan(a5)
  13824.     bra    @f
  13825. _pan_tbl_:    dc.b    -1,0,127,64
  13826. @@:
  13827.     add.b    #$18,d1        *$38+n
  13828.     move.b    (a1)+,d2    *5)PMS/AMS
  13829.     jsr    (a4)        *opmset
  13830.  
  13831. OP_parameters:
  13832. *-----------------------------------
  13833.     moveq.l    #4-1,d0
  13834. @@:
  13835.     addq.b    #8,d1
  13836.     move.b    (a1)+,d2    *6)~9)DT1/MUL
  13837.     jsr    (a4)        *opmset
  13838.     dbra    d0,@b
  13839. *-----------------------------------
  13840. *    tst.w    p_level_param(a5)        *!
  13841. *    bne    @f            *!
  13842. *    move.w    #4,p_level_param(a5)    *!
  13843.     or.w    #4,p_level_param(a5)    *!
  13844. *@@:                    *!
  13845.     addq.w    #4,a1
  13846.     add.w    #32,d1
  13847. *-----------------------------------
  13848.     moveq.l    #16-1,d0
  13849. @@:
  13850.     addq.b    #8,d1        *14)KS/AR~29)1DL/RR
  13851.     move.b    (a1)+,d2
  13852.     jsr    (a4)        *opmset
  13853.     dbra    d0,@b
  13854. *-----------------------------------
  13855. exit_fmvset:
  13856.     movem.l    (sp)+,reglist
  13857. _exit_fmvset:
  13858.     rts
  13859.  
  13860. timbre2_fm:            *FM H-LFOノンタッチ・音色切り換え(MXDRV.Xコンパチ)
  13861.     moveq.l    #0,d0
  13862.     move.b    (a0)+,d0
  13863.     lsl.w    #8,d0
  13864.     move.b    (a0)+,d0
  13865.     move.w    d0,p_pgm(a5)
  13866.     move.b    p_bank_msb(a5),d1
  13867.     ext.w    d1
  13868.     bmi    @f
  13869.     lsl.w    #7,d1
  13870.     move.b    p_bank_lsb(a5),d2
  13871.     bmi    @f
  13872.     or.b    d2,d1
  13873.     lsl.w    #7,d1
  13874.     add.w    d1,d0        *バンク考慮
  13875. @@:
  13876.     moveq.l    #0,d1
  13877.     move.b    p_next_on(a5),d1
  13878.     cmp.w    p_voice_rsv(a5),d1
  13879.     bls    @f
  13880.     moveq.l    #0,d1
  13881. @@:
  13882.     clr.b    p_tone_set(a5)
  13883.     bset.b    d1,p_tone_set(a5)
  13884.     add.w    d1,d4
  13885.     andi.w    #$07,d4
  13886.     move.w    d4,d1
  13887.     add.w    d1,d1
  13888.     move.l    (a6),a1
  13889.     lea    fm_tone_set-work(a6),a4
  13890.     move.w    -(a1),(a4,d1.w)
  13891.     move.b    d4,p_timbre_src(a5)
  13892.     bsr    mx_fmvset
  13893.     move.w    p_ch(a5),d4
  13894.     bra    next_cmd_fm
  13895.  
  13896. mx_fmvset:            *FM音色のセット
  13897.     * < d0.l=sound number(0~32767)
  13898.     * < d4.w=ch
  13899.     * < a5=seq_wk_tbl n
  13900.     * - all
  13901.     cmp.w    fmsnd_n_max-work(a6),d0
  13902.     bcc    _exit_fmvset
  13903.     movem.l    reglist,-(sp)
  13904.     lsl.l    #4,d0
  13905.     move.l    d0,d1
  13906.     add.l    d0,d0
  13907.     add.l    d1,d0        *fmsnd_size倍
  13908.     movea.l    fmsnd_buffer-work(a6),a1
  13909.     adda.l    d0,a1
  13910.     tst.w    (a1)+
  13911.     beq    exit_fmvset
  13912.     move.l    p_opmset(a5),a4
  13913.     bsr    init_rr
  13914.     bsr    swk_copy    *アウトプットレベル等のワークへのコピー(PAN保存)
  13915.  
  13916.     addq.w    #4,a1
  13917.  
  13918.     moveq.l    #$20,d1        *LR/AF
  13919.     or.b    d4,d1
  13920.     move.b    (a1)+,d0    *4)PAN/AF
  13921.     andi.b    #$3f,d0        *mask pan
  13922.     move.b    p_pan(a5),d2    *get default pan
  13923.     bsr    conv_p@p
  13924.     ror.b    #2,d2
  13925.     or.b    d0,d2
  13926.     jsr    (a4)        *opmset
  13927.     addq.w    #1,a1
  13928.     add.b    #$18,d1        *$38+n
  13929.     bra    OP_parameters
  13930.  
  13931. swk_copy:            *あとでボリューム変更等で使うので音色数列のなかから
  13932.     * < d4.w=ch
  13933.     * X d0            *必要なパラメータをワークへ待避する
  13934.     * - a4
  13935.     move.b    10(a1),ol1-work(a6,d4.w)
  13936.     move.b    12(a1),ol2-work(a6,d4.w)
  13937.     move.b    11(a1),ol3-work(a6,d4.w)
  13938.     move.b    13(a1),ol4-work(a6,d4.w)
  13939.     move.b    4(a1),d0
  13940.     andi.w    #7,d0                    *get algorithm
  13941.     move.b    carrier_tbl(pc,d0.w),cf-work(a6,d4.w)    *CF
  13942.     move.b    3(a1),d0                *3)SYNC/OM/WF
  13943.     btst.b    #b_slot_mask,p_md_flg(a5)
  13944.     bne    @f
  13945.     and.b    #%0111_1000,d0                *get OM
  13946.     move.b    d0,p_om(a5)
  13947.     not.b    d0
  13948.     move.b    d0,opm_nom-work(a6,d4.w)
  13949. @@:
  13950.     rts
  13951.  
  13952. carrier_tbl:            *アルゴリズムに対応するキャリアの位置
  13953.     dc.b    %1000        *AL0
  13954.     dc.b    %1000        *AL1
  13955.     dc.b    %1000        *AL2
  13956.     dc.b    %1000        *AL3
  13957.     dc.b    %1010        *AL4
  13958.     dc.b    %1110        *AL5
  13959.     dc.b    %1110        *AL6
  13960.     dc.b    %1111        *AL7
  13961.  
  13962. timbre2_ad:            *ADPCM 音色切り換え
  13963. timbre_ad:            *ADPCM 音色切り換え
  13964.     move.b    (a0)+,p_pgm+0(a5)
  13965.     move.b    (a0)+,p_pgm+1(a5)
  13966.     bra    next_cmd_ad
  13967.  
  13968. do_timbre_split_ad:        *ADPCM音色スプリット
  13969. do_timbre_split_md:        *MIDI 音色スプリット
  13970.     * < d7.b=note
  13971.     * < d1.hw=bank
  13972.     * < d1.lw=timbre
  13973.     * > d1.hw=bank
  13974.     * > d1.lw=timbre
  13975.     * x d0-d2/a2
  13976.     lea    p_split_tbl(a5),a2
  13977.     moveq.l    #n_of_split-1,d2
  13978. @@:
  13979.     move.b    pst_split_st(a2),d0    *range start param
  13980.     bmi    do_split_md
  13981.     cmp.b    d0,d7
  13982.     bcs    next_dtsm
  13983.     move.b    pst_split_ed(a2),d0    *range end param
  13984.     bmi    do_split_md
  13985.     cmp.b    d0,d7
  13986.     bls    do_split_md
  13987. next_dtsm:
  13988.     addq.w    #pst_split_len,a2
  13989.     dbra    d2,@b
  13990.     rts            *splitなし
  13991.  
  13992. do_split_md:
  13993.     move.w    pst_split_bank(a2),d0    *get bank number
  13994.     cmp.w    p_bank_msb(a5),d0    *バンクの比較もする
  13995.     beq    @f
  13996.     move.w    d0,p_bank_msb(a5)
  13997.     swap    d1
  13998.     move.w    d0,d1
  13999.     swap    d1
  14000.     move.w    pst_split_pgm(a2),d0
  14001.     move.w    d0,p_pgm(a5)
  14002.     move.w    d0,d1
  14003.     rts
  14004. @@:                    *音色番号の比較
  14005.     move.w    pst_split_pgm(a2),d0
  14006.     cmp.w    p_pgm(a5),d0        *すでに同じ音色が設定されているならばスキップ
  14007.     beq    @f
  14008.     move.w    d0,p_pgm(a5)
  14009.     move.w    d0,d1
  14010. @@:
  14011.     rts
  14012.  
  14013. timbre2_md:            *MIDI 音色切り換え
  14014. timbre_md:            *MIDI 音色切り換え
  14015.     move.b    (a0)+,d1    *get sound number H
  14016.     lsl.w    #8,d1
  14017.     move.b    (a0)+,d1    *get sound number L
  14018.     move.l    p_midi_trans(a5),a2
  14019.     cmpi.w    #127,d1
  14020.     bhi    @f
  14021.     move.w    d1,p_pgm(a5)
  14022.     bset.b    #pts_program,p_timbre_set(a5)
  14023.     bra    next_cmd_md
  14024. @@:
  14025.     move.l    d1,d3
  14026.     lsr.w    #7,d3
  14027.     andi.w    #127,d3        *bank msb
  14028.     cmp.b    p_bank_msb(a5),d3
  14029.     beq    @f
  14030.     move.b    d3,p_bank_msb(a5)
  14031.     tas.b    p_timbre_set(a5)
  14032. @@:
  14033.     andi.w    #127,d1        *pgm number
  14034.     move.w    d1,p_pgm(a5)
  14035.     bset.b    #pts_program,p_timbre_set(a5)
  14036.     bra    next_cmd_md
  14037. *------------------------------------------------------------------------------
  14038. bank_select_ad:            *Iコマンド(bank select)
  14039.     move.b    (a0)+,d0
  14040.     bmi    @f
  14041.     move.b    d0,p_bank_msb(a5)
  14042. @@:
  14043.     move.b    (a0)+,d0
  14044.     bmi    @f
  14045.     move.b    d0,p_bank_lsb(a5)
  14046. @@:
  14047.     btst.b    #b_vtune_mode,p_md_flg(a5)
  14048.     bne    next_cmd_ad
  14049.     move.w    p_bank_msb(a5),p_pgm(a5)    *TONE MODE時
  14050.     bra    next_cmd_ad
  14051.  
  14052. bank_select_fm:            *Iコマンド(bank select)
  14053.     move.b    (a0)+,d0
  14054.     bmi    @f
  14055.     move.b    d0,p_bank_msb(a5)
  14056. @@:
  14057.     move.b    (a0)+,d0
  14058.     bmi    next_cmd_fm
  14059.     move.b    d0,p_bank_lsb(a5)
  14060.     bra    next_cmd_fm
  14061.  
  14062. bank_select_md:            *Iコマンド(bank select) ctrl chg 0,32
  14063. *!97/2/6    tas.b    p_timbre_set(a5)
  14064.     move.l    p_midi_trans(a5),a2
  14065.     move.b    (a0)+,d1
  14066.     bmi    @f
  14067.     move.b    d1,p_bank_msb(a5)
  14068.     moveq.l    #$b0,d0
  14069.     or.b    d4,d0
  14070.     jsr    (a2)
  14071.     moveq.l    #$00,d0        *bank MSB
  14072.     jsr    (a2)
  14073.     move.b    d1,d0
  14074.     jsr    (a2)
  14075. @@:
  14076.     move.b    (a0)+,d1
  14077.     bmi    next_cmd_md
  14078.     move.b    d1,p_bank_lsb(a5)
  14079.     moveq.l    #$b0,d0
  14080.     or.b    d4,d0
  14081.     jsr    (a2)
  14082.     moveq.l    #$20,d0        *bank LSB
  14083.     jsr    (a2)
  14084.     move.b    d1,d0
  14085.     jsr    (a2)        *BANK送信
  14086.     bra    next_cmd_md
  14087.  
  14088. do_timbre_split_fm:        *FM 音色スプリット
  14089.     * < d1.w=offset
  14090.     * < d7.b=note
  14091. reglist    reg    d0-d2/d4-d5/a2
  14092.     movem.l    reglist,-(sp)
  14093.     lea    p_split_tbl(a5),a2
  14094.     moveq.l    #n_of_split-1,d2
  14095. @@:
  14096.     move.b    pst_split_st(a2),d0    *range start param
  14097.     bmi    do_split_fm
  14098.     cmp.b    d0,d7
  14099.     bcs    next_dtsf
  14100.     move.b    pst_split_ed(a2),d0    *range end param
  14101.     bmi    do_split_fm
  14102.     cmp.b    d0,d7
  14103.     bls    do_split_fm
  14104. next_dtsf:
  14105.     addq.w    #pst_split_len,a2
  14106.     dbra    d2,@b
  14107.     movem.l    (sp)+,reglist
  14108.     rts                *splitなし
  14109.  
  14110. do_split_fm:
  14111.     move.w    pst_split_bank(a2),d0    *get bank number
  14112.     cmp.w    p_bank_msb(a5),d0    *バンクの比較もする
  14113.     beq    @f
  14114.     move.w    d0,p_bank_msb(a5)
  14115.     clr.b    p_tone_set(a5)
  14116. @@:                    *音色番号の比較
  14117.     move.w    pst_split_pgm(a2),d0
  14118.     cmp.w    p_pgm(a5),d0        *すでに同じ音色が設定されているならばスキップ
  14119.     beq    @f
  14120.     move.w    d0,p_pgm(a5)
  14121.     clr.b    p_tone_set(a5)
  14122. @@:
  14123.     bset.b    d1,p_tone_set(a5)    *音色設定済みマークON
  14124.     bne    1f            *すでにマーク済み(音色設定済み)ならばEXIT
  14125.     add.b    d1,d4
  14126.     andi.w    #$07,d4
  14127.     move.b    d4,p_timbre_src(a5)
  14128.     move.w    p_pgm(a5),d0
  14129.     moveq.l    #0,d1
  14130.     move.b    p_bank_msb(a5),d5
  14131.     bmi    @f
  14132.     move.b    d5,d1
  14133.     andi.w    #$7f,d0            *バンクモードならばpgm=0-127
  14134. @@:
  14135.     lsl.w    #7,d1
  14136.     moveq.l    #0,d2
  14137.     move.b    p_bank_lsb(a5),d5
  14138.     bmi    @f
  14139.     move.b    d5,d2
  14140.     andi.w    #$7f,d0            *バンクモードならばpgm=0-127
  14141. @@:
  14142.     or.b    d2,d1
  14143.     lsl.w    #7,d1
  14144.     add.w    d1,d0            *バンク考慮
  14145.     bsr    fmvset
  14146. 1:
  14147.     movem.l    (sp)+,reglist
  14148.     rts
  14149. *------------------------------------------------------------------------------
  14150. do_adpcm_frq:
  14151.     * < d1.b=frq
  14152.     * < d4.b=ch
  14153. adpcm_frq_patch0:        *パッチが当たる(bra frq_mpcm)
  14154.     move.l    d1,d0
  14155.     move.b    d0,adpcm_frq-work(a6)
  14156.     tst.b    se_mode-work(a6)
  14157.     bne    exit_fa        *se modeで演奏中ならexit
  14158.     move.w    sr,-(sp)
  14159.     ori.w    #$0700,sr
  14160.     move.b    OPMCTRL.w,d2    *音声合成クロック読みだし
  14161.     tas.b    d2        *最上位ビット=1だと4MHz,0だと8MHz
  14162.     cmpi.b    #$05,d0
  14163.     bhi    1f        *31.2kHz
  14164.     beq    2f        *20.8kHz
  14165.     cmpi.b    #$02,d0
  14166.     bcs    @f        *5.2kHzならばクロック4MHz
  14167.     subq.b    #$02,d0
  14168.     andi.b    #$7f,d2        *7.8kHzならばクロック8MHz
  14169.     bra    @f
  14170. 1:
  14171.     moveq.l    #3,d0
  14172.     andi.b    #$7f,d2
  14173.     bra    @f
  14174. 2:
  14175.     moveq.l    #3,d0
  14176. @@:
  14177.     moveq.l    #$1b,d1
  14178.     jsr    opmset-work(a6)    *クロックを書き込む
  14179.     lsl.b    #2,d0
  14180.     andi.b    #%0000_1100,d0
  14181.     move.b    $e9a005,d1    *周波数やパンをゲット
  14182.     andi.b    #%1111_0011,d1
  14183.     or.b    d0,d1        *設定値を作成
  14184.     move.b    d1,$e9a005    *コントロールデータ送信
  14185.     move.w    (sp)+,sr
  14186. exit_fa:
  14187.     rts
  14188.  
  14189. frq_mpcm:            *mpcmモード時のfrqチェンジ
  14190.     * < d1.b=frq(0-4,5,6)
  14191.     * x d0,d1
  14192. frq_mpcm_patch:            *V2互換モードではパッチ(NOP)
  14193.     bra.s    1f
  14194.     cmpi.b    #5,d1        *16bitPCM
  14195.     beq    @f
  14196.     cmpi.b    #6,d1        *8bitPCM
  14197.     bne    1f
  14198. @@:
  14199.     moveq.l    #4,d1        *15.6kHz
  14200. 1:
  14201.     move.w    #M_SET_FRQ,d0
  14202.     move.b    d4,d0
  14203.     MPCM_call
  14204.     rts
  14205. *------------------------------------------------------------------------------
  14206. do_adpcm_pan:
  14207.     * < d2.b=panpot(0-127)
  14208.     * < d4.b=ch
  14209.     * - d3
  14210. adpcm_pan_patch0:            *パッチが当たる(bra pan_mpcm)
  14211.     bsr    conv_p@p
  14212.     move.b    d2,adpcm_pan-work(a6)    *グローバルパラメータ
  14213.     tst.b    se_mode-work(a6)
  14214.     bne    exit_pa            *se modeで演奏中ならexit
  14215.     lea    $e9a005,a1
  14216.     move.b    (a1),d0
  14217.     and.b    #%1111_1100,d0
  14218.     tst.b    d2
  14219.     beq    @f
  14220.     cmpi.b    #3,d2        *出力チェック
  14221.     bne    pa1
  14222. @@:
  14223.     eori.b    #%0000_0011,d2    *ビット反転
  14224. pa1:
  14225.     or.b    d2,d0
  14226.     move.b    d0,(a1)
  14227. exit_pa:
  14228.     rts
  14229.  
  14230. pan_mpcm:                *mpcmモード時のパン
  14231.     * < d2.b=0-127,128
  14232.     * < d4.b=ch
  14233.     * x d0,d1
  14234.     move.b    d2,d1
  14235.     bsr    conv_p@p
  14236.     move.b    d2,adpcm_pan-work(a6)    *グローバルパラメータ
  14237.     tas.b    d1
  14238.     bpl    @f
  14239.     moveq.l    #0,d1
  14240. @@:
  14241.     move.w    #M_SET_PAN,d0
  14242.     move.b    d4,d0
  14243.     MPCM_call
  14244.     rts
  14245.  
  14246. single_pkon:                *単音発音
  14247.     cmpi.b    #91,d1
  14248.     bcs    @f            *音量が小さいとみなす
  14249.     tst.b    se_mode-work(a6)
  14250.     bne    @f            *se modeで演奏中ならexit
  14251.     move.w    p_frq(a5),d2        *d2.lb=p_pan(a5)  d2.hb=p_frq(a5)
  14252.     bsr    conv_p@p        *0-127→1-3
  14253.     move.w    d2,d1            *d1=frq/pan
  14254.     move.l    adt_size(a1),d2
  14255.     move.l    adt_addr(a1),a1
  14256.     bra    adpcmout
  14257.  
  14258. pcm_key_off:
  14259.     * < d0.w=ch
  14260. pkof_patch0:                *パッチがあたる(bra single_pkof)
  14261.     or.w    #M_KEY_OFF,d0
  14262.     MPCM_call
  14263. @@:
  14264.     rts
  14265.  
  14266. single_pkof:
  14267.     tst.b    se_mode-work(a6)
  14268.     bne    @b
  14269.     bra    adpcm_end
  14270.  
  14271. pcm_key_on:
  14272.     * < d4.w=ch
  14273.     * < d1.b=vol
  14274.     * < d2.l=pitch
  14275.     * < a1.l=data table address
  14276.     * X d0,d1
  14277. pkon_patch0:            *パッチがあたる(bra single_pkon)
  14278. *    move.w    #M_SET_VOL,d0
  14279. *    move.b    d4,d0
  14280. *    bsr    debug1
  14281. *    MPCM_call        *音量設定
  14282.  
  14283.     moveq.l    #0,d1
  14284.     move.b    p_frq(a5),d1
  14285.     bsr    frq_mpcm
  14286.  
  14287.     move.b    p_pan(a5),d1
  14288.     tas.b    d1
  14289.     bpl    @f
  14290.     moveq.l    #0,d1
  14291. @@:
  14292.     move.w    #M_SET_PAN,d0
  14293.     move.b    d4,d0
  14294.     MPCM_call
  14295.  
  14296.     moveq.l    #0,d1        *table type
  14297.     move.w    #M_SET_PCM,d0
  14298.     move.b    d4,d0
  14299.     MPCM_call        *データ登録
  14300.  
  14301.     move.l    d2,d1
  14302.     move.w    #M_SET_PITCH,d0
  14303.     move.b    d4,d0
  14304.     MPCM_call
  14305. datatype_mpcm_patch:        *V2互換モードではパッチ(NOP)
  14306.     bra.s    2f
  14307.     move.b    p_frq(a5),d0    *8bitPCMや16bitPCMにデータタイプを変更する
  14308.     cmpi.b    #5,d0        *16bitPCM
  14309.     bne    @f
  14310.     moveq.l    #1,d1
  14311.     bra    1f
  14312. @@:
  14313.     cmpi.b    #6,d0        *8bitPCM
  14314.     bne    2f
  14315.     moveq.l    #2,d1
  14316. 1:
  14317.     move.w    #M_CHG_PCMKIND,d0
  14318.     move.b    d4,d0
  14319.     MPCM_call
  14320. 2:
  14321.     move.l    d4,d0
  14322.     MPCM_call        *発音
  14323.     rts
  14324.  
  14325. set_ad_tune:            *音程設定 (パッチが当たる(RTS))
  14326.     * < d1.b=midi note number
  14327.     * < d4.w=ch
  14328.     * < d5.w=tune
  14329.     andi.w    #$7f,d1        *最上位ビットを殺す
  14330.     move.l    pcm_tune_tbl-work(a6),d0
  14331.     beq    @f
  14332.     move.l    d0,a1
  14333.     move.b    (a1,d1.w),d0
  14334.     ext.w    d0
  14335. @@:
  14336.     lsl.w    #6,d1        *64倍
  14337.     add.w    d0,d1
  14338.     add.w    p_detune(a5),d1
  14339.     add.w    d5,d1        *d1.w=pitch
  14340.     move.w    #M_SET_PITCH,d0
  14341.     move.b    d4,d0
  14342.     MPCM_call
  14343.     rts
  14344. *----------------------------------------
  14345. *    X68k ADPCM PUTI NOISE ELIMINATOR
  14346. *
  14347. *        XAPNEL
  14348. *
  14349. *     Programmed by Z.Nishikawa
  14350. *----------------------------------------
  14351. DMADSTAT:    equ    $c32
  14352. OPMCTRL:    equ    $9da
  14353. *    以下'XAPNEL.X'のルーチンの流用です
  14354.  
  14355. adpcmout:            *IOCS    $60
  14356.     move.w    sr,-(sp)
  14357.     ori.w    #$0700,sr
  14358.     movem.l    d1-d2/a0-a2,-(sp)
  14359.     bsr    adpcm_end
  14360.     lea    OCR3,a0
  14361.     lea    last_param(pc),a2
  14362.     move.w    d1,(a2)+
  14363.     move.l    a1,(a2)+
  14364.     move.l    d2,(a2)+
  14365.     clr.w    (a2)
  14366.  
  14367.     moveq.l    #0,d0
  14368.  
  14369.     cmpi.l    #$feff,d2
  14370.     bls    adpcm_sgl    *$feff以下なら単回処理(<d0.l=0)
  14371.  
  14372.     move.l    d2,d0
  14373.     move.l    #$feff,d2
  14374.     divu    d2,d0
  14375.     swap    d0
  14376.     tst.w    d0
  14377.     beq    @f
  14378.     swap    d0
  14379.     bra    store_lpc
  14380. @@:
  14381.     swap    d0
  14382.     subq.w    #1,d0
  14383. store_lpc:
  14384.     move.w    d0,(a2)        *d0回数
  14385.     sub.l    d2,-4(a2)    *size補正
  14386.     moveq.l    #$80,d0        *ループ指定
  14387. adpcm_sgl:
  14388.     * a0=OCR3,a2=last_feff
  14389.  
  14390.     addq.b    #%0000_0010,d0    *play指定
  14391.     move.b    d0,DMADSTAT.w
  14392.     move.b    #%0111_1010,(a0)    *aray mode
  14393.     st    CSR3-OCR3(a0)        *status set
  14394.     move.w    #2,BTC3-OCR3(a0)    *アレイテーブルの個数
  14395.     lea    aray_tbl(pc),a2
  14396.     move.l    a2,BAR3-OCR3(a0)    *アレイテーブルのアドレス
  14397.     move.l    a1,next_at-aray_tbl(a2)
  14398.     move.w    d2,next_at+4-aray_tbl(a2)
  14399.     bsr    adpcm_dtst
  14400.     move.b    #$02,$e92001
  14401.     moveq.l    #0,d0
  14402.     movem.l    (sp)+,d1-d2/a0-a2
  14403.     move.w    (sp)+,sr
  14404.     rts
  14405.  
  14406. adpcm_dtst:
  14407.     * X d0,d1,a1
  14408.     move.w    d1,d0
  14409.     andi.w    #$8080,d0
  14410.     bne    2f        *両方省略
  14411.     bmi    skip_frq_ope
  14412.     move.b    OPMCTRL.w,d0    *音声合成クロック読みだし
  14413.     tas.b    d0
  14414.     cmpi.w    #$06_00,d1    *31.2kHz?
  14415.     bcc    1f
  14416.     cmpi.w    #$05_00,d1    *20.8kHz?
  14417.     bcc    2f
  14418.     cmpi.w    #$02_00,d1
  14419.     bcs    @f        *5.2kHzならばクロック4MHz
  14420.     sub.w    #$02_00,d1
  14421.     andi.b    #$7f,d0        *7.8kHzならばクロック8MHz
  14422.     bra    @f
  14423. 1:
  14424.     move.w    #$03_00,d1
  14425.     andi.b    #$7f,d0
  14426.     bra    @f
  14427. 2:
  14428.     move.w    #$03_00,d1
  14429. @@:
  14430.     move.w    sr,-(sp)
  14431.     ori.w    #$0700,sr
  14432.     move.b    d0,OPMCTRL.w
  14433.     opmset    #$1b,d0        *クロックを書き込む
  14434.     lea    work,a1
  14435.     move.b    d0,$1b+opmreg(a1)
  14436.     move.w    (sp)+,sr
  14437.     move.w    d1,d0
  14438.     andi.b    #%1000_0011,d0
  14439.     bmi    skip_pan_ope    *パン省略
  14440.     beq    @f
  14441.  
  14442.     cmpi.b    #3,d0        *出力チェック
  14443.     bne    1f
  14444. @@:
  14445.     eori.b    #%0000_0011,d0    *ビット反転
  14446. 1:
  14447.     lsr.w    #6,d1        *サンプリング周波数を下位バイトへ
  14448.     andi.b    #%0000_1100,d1
  14449.     or.b    d0,d1        *出力モードを重ね合わせる
  14450.     move.b    $e9a005,d0    *周波数やパンをゲット
  14451.     andi.b    #%1111_0000,d0
  14452.     or.b    d1,d0        *設定値を作成
  14453.     move.b    d0,$e9a005    *コントロールデータ送信
  14454. 2:
  14455.     move.b    #$88,CCR3-OCR3(a0)    *dma start
  14456.     rts
  14457.  
  14458. skip_frq_ope:            *周波数設定省略ケース
  14459.     move.w    d1,d0
  14460.     andi.b    #%0000_0011,d0
  14461.     beq    @f
  14462.  
  14463.     cmpi.b    #3,d0        *出力チェック
  14464.     bne    1f
  14465. @@:
  14466.     eori.b    #%0000_0011,d0    *ビット反転
  14467. 1:                * < d0.b=pan
  14468.     move.b    $e9a005,d1    *周波数やパンをゲット
  14469.     andi.b    #%1111_1100,d1    *パンポット以外を保存
  14470.     or.b    d1,d0        *パンポット値を重ねる
  14471.     move.b    d0,$e9a005    *コントロールデータ送信
  14472.     move.b    #$88,CCR3-OCR3(a0)    *dma start
  14473.     rts
  14474.  
  14475. skip_pan_ope:            *パンポット省略ケース
  14476.     lsr.w    #6,d1        *サンプリング周波数を下位バイトへ
  14477.     andi.b    #%0000_1100,d1
  14478.     move.b    $e9a005,d0    *周波数やパンをゲット
  14479.     andi.b    #%1111_0011,d0
  14480.     or.b    d1,d0        *周波数値を重ねる
  14481.     move.b    d0,$e9a005    *コントロールデータ送信
  14482.     move.b    #$88,CCR3-OCR3(a0)    *dma start
  14483.     rts
  14484.  
  14485. adpcmmod:            *IOCS    $67
  14486.     tst.b    d1
  14487.     beq    adpcm_end
  14488.     cmpi.b    #1,d1
  14489.     beq    adpcm_stop
  14490.     cmpi.b    #2,d1
  14491.     beq    adpcm_cnt
  14492.     moveq.l    #-1,d0    *エラーコード
  14493.     rts
  14494. adpcm_end:
  14495.     tst.b    se_mode
  14496.     bne    @f
  14497.     moveq.l    #0,d0        *終了コード
  14498.     move.w    sr,-(sp)
  14499.     ori.w    #$0700,sr    *最上位割り込みマスク
  14500.     move.b    #$10,CCR3
  14501.     move.b    #$88,$e92003
  14502.     move.w    d0,DMADSTAT.w
  14503.     move.w    (sp)+,sr
  14504. @@:
  14505.     rts
  14506. adpcm_stop:
  14507.     moveq.l    #0,d0
  14508.     move.w    sr,-(sp)
  14509.     ori.w    #$0700,sr
  14510.     move.b    d0,se_mode
  14511.     move.b    #$20,CCR3    *動作中断
  14512.                 *move.b    #$88,$e92003をしないのは再開した時に音が変に鳴るから
  14513.     move.w    (sp)+,sr
  14514.     rts
  14515. adpcm_cnt:
  14516.     move.b    #$08,CCR3    *動作継続
  14517.     moveq.l    #0,d0
  14518.     rts
  14519.  
  14520. int_adpcm_stop:            *ADPCMデータの再生が終了するとここへくる
  14521.     ori.w    #$0700,sr
  14522.     movem.l    d0-d2/a0-a1,-(sp)
  14523.     lea    last_feff(pc),a0
  14524.     tst.w    (a0)
  14525.     beq    stop_quit
  14526.     subq.w    #1,(a0)
  14527.     move.l    #$feff,d1
  14528.     move.l    -(a0),d0    *get size
  14529.     move.l    d0,d2
  14530.     sub.l    d1,d0
  14531.     bcs    @f
  14532.     sub.l    d1,(a0)        *size=size-$feff
  14533.     move.l    d1,d2
  14534. @@:
  14535.     add.l    d1,-(a0)
  14536.     move.l    (a0),a1        *get address
  14537.     move.w    -(a0),d1    *get param
  14538.  
  14539.     lea    OCR3,a0
  14540.     move.b    #%0000_0010,DMADSTAT.w
  14541.     move.b    #%0111_0010,(a0)    *no aray
  14542.     st    CSR3-OCR3(a0)        *status set
  14543.     move.l    a1,MAR3-OCR3(a0)
  14544.     move.w    d2,MTC3-OCR3(a0)
  14545.     bsr    adpcm_dtst
  14546.     move.b    #$02,$e92001
  14547.  
  14548.     movem.l    (sp)+,d0-d2/a0-a1
  14549.     rte
  14550.  
  14551. stop_quit:
  14552.     move.b    #$10,CCR3    *dma stop
  14553.     st    CSR3        *status clear
  14554.     move.b    #$88,$e92003
  14555.     moveq.l    #0,d0
  14556.     move.b    d0,DMADSTAT.w
  14557.     move.b    d0,se_mode
  14558.     movem.l    (sp)+,d0-d2/a0-a1
  14559.     rte
  14560.  
  14561. aray_tbl:
  14562.     dc.l    dummy_data
  14563.     dc.w    num_of_80
  14564. next_at:
  14565.     dc.l    0
  14566.     dc.w    0
  14567. dummy_data:    dcb.b    num_of_80,$80
  14568.     .even
  14569. last_param:    ds.w    1
  14570. last_address:    ds.l    1
  14571. last_size:    ds.l    1
  14572. last_feff:    dc.w    0
  14573.     .even
  14574.  
  14575.     if    (debug.and.1)
  14576. debug2:                *デバグ用ルーチン(レジスタ値を表示/割り込み対応)
  14577.     move.w    sr,db_work2    *save sr
  14578.     ori.w    #$700,sr    *mask int
  14579.     movem.l    d0-d7/a0-a7,db_work
  14580.  
  14581.     moveq.l    #%0011,d1
  14582.     IOCS    _B_COLOR
  14583.  
  14584.     lea    str__(pc),a1
  14585.  
  14586.     move.w    #$0d0a,(a1)+
  14587.  
  14588.     moveq.l    #8-1,d7
  14589.     lea    db_work(pc),a6
  14590. dbg2_lp01:
  14591.     move.l    (a6)+,d0
  14592.     bsr    _get_hex32
  14593.     addq.w    #8,a1
  14594.     cmpi.b    #4,d7
  14595.     bne    @f
  14596.     move.b    #' ',(a1)+
  14597. @@:
  14598.     move.b    #' ',(a1)+
  14599.     dbra    d7,dbg2_lp01
  14600.  
  14601.     move.b    #$0d,(a1)+
  14602.     move.b    #$0a,(a1)+
  14603.  
  14604.     moveq.l    #8-1,d7
  14605. dbg2_lp02:
  14606.     move.l    (a6)+,d0
  14607.     bsr    _get_hex32
  14608.     addq.w    #8,a1
  14609.     cmpi.b    #4,d7
  14610.     bne    @f
  14611.     move.b    #' ',(a1)+
  14612. @@:
  14613.     move.b    #' ',(a1)+
  14614.     dbra    d7,dbg2_lp02
  14615.  
  14616.     moveq.l    #0,d0
  14617.     move.w    db_work2(pc),d0        *SR
  14618.     bsr    _get_hex32
  14619.     addq.w    #8,a1
  14620.     move.b    #' ',(a1)+
  14621.     move.l    (a7),d0            *PC
  14622.     bsr    _get_hex32
  14623.     addq.w    #8,a1
  14624.     clr.b    (a1)+
  14625.     lea    str__(pc),a1
  14626.     IOCS    _B_PRINT
  14627. *@@:
  14628. *    btst.b    #5,$806.w
  14629. *    bne    @b
  14630.  
  14631.     movem.l    db_work(pc),d0-d7/a0-a7
  14632.     move.w    db_work2(pc),sr    *get back sr
  14633.     rts
  14634.  
  14635. debug1:
  14636.     move.w    sr,-(sp)
  14637.     move.l    a6,-(sp)
  14638.     move.l    tad(pc),a6
  14639.     move.b    d1,(a6)+
  14640.     move.l    a6,tad
  14641.     move.l    (sp)+,a6
  14642.     move.w    (sp)+,sr
  14643. @@:
  14644.     rts
  14645.  
  14646. _get_hex32:            *値→16進数文字列(4bytes)
  14647.     * < d0=data value
  14648.     * < a1=格納したいアドレス
  14649.     * > (a1)=ascii numbers
  14650.     * - all
  14651.     movem.l    d0-d1/d4/a1,-(sp)
  14652.     addq.w    #8,a1
  14653.     clr.b    (a1)
  14654.     moveq.l    #8-1,d4
  14655. _gh_lp32:
  14656.     move.b    d0,d1
  14657.     andi.b    #$0f,d1
  14658.     add.b    #$30,d1
  14659.     cmpi.b    #'9',d1
  14660.     bls    @f
  14661.     addq.b    #7,d1
  14662. @@:
  14663.     move.b    d1,-(a1)
  14664.     lsr.l    #4,d0
  14665.     dbra    d4,_gh_lp32
  14666.     movem.l    (sp)+,d0-d1/d4/a1
  14667.     rts
  14668.  
  14669.         *デバッグ用ワーク
  14670.     .even
  14671. str__:        ds.b    96*2
  14672.         dc.b    'REGI'
  14673. db_work:    dcb.l    16,0        *for debug
  14674. db_work2:    dc.l    0
  14675. tad:        dc.l    $e40000
  14676.  
  14677.     endif
  14678.